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

Ответ 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-строки.