如何在 Spark SQL 中解析嵌套的 JSON 对象?

问题描述 投票:0回答:5

我有一个如下所示的架构。如何解析嵌套对象?

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)
json apache-spark apache-spark-sql
5个回答
28
投票

假设您读取 json 文件并打印您向我们展示的架构,如下所示:

DataFrame df = sqlContext.read().json("/path/to/file").toDF();
    df.registerTempTable("df");
    df.printSchema();

然后您可以像这样选择结构类型内的嵌套对象...

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();

5
投票

试试这个:

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


3
投票

您是否尝试过直接从 SQL 查询中执行此操作,例如

Select apps.element.Ratings from yourTableName

这可能会返回一个数组,您可以更轻松地访问其中的元素。 另外,当我必须处理大型 JSON 结构且架构过于复杂时,我会使用此在线 Json 查看器: http://jsonviewer.stack.hu/


3
投票

我正在使用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 字符串可以明显缩短代码。


1
投票
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()
© www.soinside.com 2019 - 2024. All rights reserved.