Обработка json в spark - разные схемы в разных файлах

У меня есть большое количество файлов 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. использовать искру, чтобы удалить символы массива или сообщить искре, что столбец должен быть типом структуры?

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

2
0
1 045
1

Ответы 1

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

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

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

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

Marek Mezei 31.10.2018 14:34

Вы можете выбрать файл со всеми необходимыми полями или дополнить его и сохранить отдельно по пути PATH_TO_JSON_WITH_RIGHT_SCHEMA и всегда использовать его для вывода правильной схемы (первая строка решения), чем использовать эту предполагаемую схему для чтения всех других файлов. , spark.read.schema (jsonWithSchema.schema) .json должен принудительно использовать правильную схему для файлов, у которых одно поле является плохим. Попробуйте и дайте мне знать, как это работает.

alexeipab 31.10.2018 15:11

Другие вопросы по теме