Как разбирать вложенные объекты JSON в искровом 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)
Ответы
Ответ 1
Предполагая, что вы читаете в 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();
Ответ 2
Попробуй это:
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/
Ответ 4
Я использую 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-строки.