Как анализировать вложенные объекты JSON в 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)

person None    schedule 29.04.2015    source источник
comment
что вы пробовали до сих пор?   -  person eliasah    schedule 29.04.2015
comment
Я пытался рассматривать каждый объект json как строку и анализировать его с помощью парсера JSONDecoder.   -  person None    schedule 29.04.2015


Ответы (4)


Предположим, вы читаете 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();
person Vasilis Vagias    schedule 14.08.2015
comment
просто чтобы добавить, приведенный выше код не требует registerTempTable для работы. Вам нужно registerTempTable только тогда, когда вам нужно выполнить искровый запрос sql. Также registerTempTable устарел со Spark 2.0 и был заменен на createOrReplaceTempView - person Arjit; 30.12.2016
comment
Предполагается, что вы знаете схему. Что делать, если вы не уверены в схеме вложенного объекта? Как вообще создать схему вложенного объекта? Я как бы задавал этот вопрос и здесь: stackoverflow.com/questions/43438774/ - person M.Rez; 16.04.2017
comment
У меня такая же проблема, и этот код мне не подходит. Когда я пытаюсь select("app.element.appName") (или аналогичные поля для моего случая, я получаю сообщение об ошибке org.apache.spark.sql.AnalysisException: No such struct field element in.... Поле элемента отсутствует в исходном json, но создано для представления массива jsonarray. Но по какой-то причине оно не находит его - person Paul; 04.11.2017

Попробуй это:

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

person ben jarman    schedule 18.05.2015

Вы пробовали делать это прямо из SQL-запроса, например

Select apps.element.Ratings from yourTableName

Это, вероятно, вернет массив, и вам будет легче получить доступ к элементам внутри. Кроме того, я использую эту онлайн-программу просмотра Json, когда мне приходится иметь дело с большими структурами JSON, а схема слишком сложна: http://jsonviewer.stack.hu/

person Adelina Balasa    schedule 04.09.2015

Я использую 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-строки.

person filip stepniak    schedule 30.01.2019