Обход объекта Json - PullRequest
       10

Обход объекта Json

0 голосов
/ 13 декабря 2018

У меня есть файл json со следующими данными:

    {
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": [
              "GML",
              "XML"
            ]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}

Мне нужно прочитать этот файл в pyspark и пройти через все элементы в json.Мне нужно распознать все структуры, массива и массива столбцов структуры и создать отдельные таблицы кустов для каждого столбца структуры и массива.

Например:

Глоссарий будет одной таблицей с заголовком в качестве столбца

GlossEntry будет другой таблицейсо столбцами «ID», «SortAs», «GlossTerm», «acronym», «abbrev»

В будущем данные будут расти с увеличением количества вложенных структур.Поэтому мне придется написать обобщенный код, который проходит через все элементы JSON и распознает все структуры и столбцы массива.

Есть ли способ перебрать все элементы во вложенной структуре?

1 Ответ

0 голосов
/ 13 декабря 2018

Spark может автоматически анализировать и выводить JSON-схему.Оказавшись в кадре данных spark, вы можете получить доступ к элементам с помощью json, указав его путь.

json_df = spark.read.json(filepath)
json_df.printSchema()

Вывод:

root
 |-- glossary: struct (nullable = true)
 |    |-- GlossDiv: struct (nullable = true)
 |    |    |-- GlossList: struct (nullable = true)
 |    |    |    |-- GlossEntry: struct (nullable = true)
 |    |    |    |    |-- Abbrev: string (nullable = true)
 |    |    |    |    |-- Acronym: string (nullable = true)
 |    |    |    |    |-- GlossDef: struct (nullable = true)
 |    |    |    |    |    |-- GlossSeeAlso: array (nullable = true)
 |    |    |    |    |    |    |-- element: string (containsNull = true)
 |    |    |    |    |    |-- para: string (nullable = true)
 |    |    |    |    |-- GlossSee: string (nullable = true)
 |    |    |    |    |-- GlossTerm: string (nullable = true)
 |    |    |    |    |-- ID: string (nullable = true)
 |    |    |    |    |-- SortAs: string (nullable = true)
 |    |    |-- title: string (nullable = true)
 |    |-- title: string (nullable = true)

Затем выберите поля для извлечения:

json_df.select("glossary.title").show()
json_df.select("glossary.GlossDiv.GlossList.GlossEntry.*").select("Abbrev","Acronym","ID","SortAs").show()

Извлеченный вывод:

+----------------+
|           title|
+----------------+
|example glossary|
+----------------+

+-------------+-------+----+------+
|       Abbrev|Acronym|  ID|SortAs|
+-------------+-------+----+------+
|ISO 8879:1986|   SGML|SGML|  SGML|
+-------------+-------+----+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...