如何在 spark sql 中解析嵌套的 JSON 对象?
How to parse nested JSON objects in spark sql?
我有一个架构,如下所示。我如何解析嵌套对象
root
|-- apps: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- appName: string (nullable = true)
| | |-- appPackage: string (nullable = true)
| | |-- Ratings: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- date: string (nullable = true)
| | | | |-- rating: long (nullable = true)
|-- id: string (nullable = true)
试试这个:
val nameAndAddress = sqlContext.sql("""
SELECT name, address.city, address.state
FROM people
""")
nameAndAddress.collect.foreach(println)
来源:
https://databricks.com/blog/2015/02/02/an-introduction-to-json-support-in-spark-sql.html
假设您读入 json 文件并打印您向我们展示的架构:
DataFrame df = sqlContext.read().json("/path/to/file").toDF();
df.registerTempTable("df");
df.printSchema();
然后你可以 select 像这样在结构类型中嵌套对象...
DataFrame app = df.select("app");
app.registerTempTable("app");
app.printSchema();
app.show();
DataFrame appName = app.select("element.appName");
appName.registerTempTable("appName");
appName.printSchema();
appName.show();
您是否尝试过直接从 SQL 查询中执行此操作,例如
Select apps.element.Ratings from yourTableName
这可能会 return 一个数组,您可以更轻松地访问其中的元素。
此外,当我必须处理大型 JSON 结构并且架构过于复杂时,我会使用此在线 Json 查看器:
http://jsonviewer.stack.hu/
我用的是pyspark,不过逻辑应该差不多。
我发现这种解析嵌套 json 的方法很有用:
df.select(df.apps.appName.alias("apps_Name"), \
df.apps.appPackage.alias("apps_Package"), \
df.apps.Ratings.date.alias("apps_Ratings_date")) \
.show()
使用 f-string 可以明显缩短代码。
var df = spark.read.format("json").load("/path/to/file")
df.createOrReplaceTempView("df");
spark.sql("select apps.element.Ratings from df where apps.element.appName like '%app_name%' ").show()
我有一个架构,如下所示。我如何解析嵌套对象
root
|-- apps: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- appName: string (nullable = true)
| | |-- appPackage: string (nullable = true)
| | |-- Ratings: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- date: string (nullable = true)
| | | | |-- rating: long (nullable = true)
|-- id: string (nullable = true)
试试这个:
val nameAndAddress = sqlContext.sql("""
SELECT name, address.city, address.state
FROM people
""")
nameAndAddress.collect.foreach(println)
来源: https://databricks.com/blog/2015/02/02/an-introduction-to-json-support-in-spark-sql.html
假设您读入 json 文件并打印您向我们展示的架构:
DataFrame df = sqlContext.read().json("/path/to/file").toDF();
df.registerTempTable("df");
df.printSchema();
然后你可以 select 像这样在结构类型中嵌套对象...
DataFrame app = df.select("app");
app.registerTempTable("app");
app.printSchema();
app.show();
DataFrame appName = app.select("element.appName");
appName.registerTempTable("appName");
appName.printSchema();
appName.show();
您是否尝试过直接从 SQL 查询中执行此操作,例如
Select apps.element.Ratings from yourTableName
这可能会 return 一个数组,您可以更轻松地访问其中的元素。 此外,当我必须处理大型 JSON 结构并且架构过于复杂时,我会使用此在线 Json 查看器: http://jsonviewer.stack.hu/
我用的是pyspark,不过逻辑应该差不多。 我发现这种解析嵌套 json 的方法很有用:
df.select(df.apps.appName.alias("apps_Name"), \
df.apps.appPackage.alias("apps_Package"), \
df.apps.Ratings.date.alias("apps_Ratings_date")) \
.show()
使用 f-string 可以明显缩短代码。
var df = spark.read.format("json").load("/path/to/file")
df.createOrReplaceTempView("df");
spark.sql("select apps.element.Ratings from df where apps.element.appName like '%app_name%' ").show()