Обработка JSON в спарк - разные схемы в разных файлах - PullRequest
0 голосов
/ 31 октября 2018

У меня есть большое количество файлов JSON, полученных от сторонних производителей. Все они имеют одинаковую схему, за исключением того, что вложенный элемент пуст, он представлен как пустой массив.

1-й пример

{
....
"survey_data":
    {
        "2": { "question":"....", "answer_id":"....", .... },
        "3": { "question":"....", "answer_id":"....", .... },
    }
 }

Так что это действительный JSON, элемент survey_data является struct_type, но с довольно сложной вложенной структурой (с большим количеством подэлементов, чем в этом упрощенном примере)

Однако, когда survey_data не имеет вложенных элементов, оно представляется как пустой массив:

{
....
"survey_data": []
 }

, что очевидно схематически несовместимо, но я не могу повлиять на это, поскольку данные получены от сторонних производителей.

Когда я хочу загрузить эти JSON-файлы в spark как один кадр данных, spark выводит тип survey_data в виде строки и экранирует все символы:

"survey_data":"{\"2\":{\"question\": ...

Это явно нехорошо для меня, я вижу 2 подхода к решению этой проблемы:

  1. каким-то образом предварительно обрабатывать файлы как чистый текст и удалять символы []?
  2. использовать spark для удаления символов массива или сообщить искру, что столбец должен иметь тип struct?

Кто-нибудь может подсказать мне решение этой проблемы?

1 Ответ

0 голосов
/ 31 октября 2018

Я думаю, что это должно работать, сделал это давным-давно.

Если у вас есть JSON-файл со схемой, которой вы довольны, предпочтительно небольшой, вы можете использовать ее схему для чтения всех других JSON-файлов:

val jsonWithSchema = spark.read.json("PATH_TO_JSON_WITH_RIGHT_SCHEMA")
val df = spark.read.schema(jsonWithSchema.schema).json("PATH_TO_DATAFILES")
...