Избегайте разбора подполя json в Spark

#json #apache-spark #schema

Вопрос:

У меня есть файлы json со сложной схемой (см. Ниже), которые я читаю с помощью Spark. Я обнаружил, что некоторые поля дублируются в исходных данных, поэтому Spark выдает ошибку при чтении (как и ожидалось). Повторяющиеся имена находятся под storageidlist полем. Что я хотел бы сделать, так это загрузить storageidlist поле в виде неразвернутой строки в столбец строкового типа и затем проанализировать его вручную. Возможно ли это в Spark?

 root  |-- errorcode: string (nullable = true)  |-- errormessage: string (nullable = true)  |-- ip: string (nullable = true)  |-- label: string (nullable = true)  |-- status: string (nullable = true)  |-- storageidlist: array (nullable = true)  | |-- element: struct (containsNull = true)  | | |-- errorcode: string (nullable = true)  | | |-- errormessage: string (nullable = true)  | | |-- fedirectorList: array (nullable = true)  | | | |-- element: struct (containsNull = true)  | | | | |-- directorId: string (nullable = true)  | | | | |-- errorcode: string (nullable = true)  | | | | |-- errordesc: string (nullable = true)  | | | | |-- metrics: string (nullable = true)  | | | | |-- portMetricDataList: array (nullable = true)  | | | | | |-- element: array (containsNull = true)  | | | | | | |-- element: struct (containsNull = true)  | | | | | | | |-- data: array (nullable = true)  | | | | | | | | |-- element: struct (containsNull = true)  | | | | | | | | | |-- ts: string (nullable = true)  | | | | | | | | | |-- value: string (nullable = true)  | | | | | | | |-- errorcode: string (nullable = true)  | | | | | | | |-- errordesc: string (nullable = true)  | | | | | | | |-- metricid: string (nullable = true)  | | | | | | | |-- portid: string (nullable = true)  | | | | | | | |-- status: string (nullable = true)  | | | | |-- status: string (nullable = true)  | | |-- metrics: string (nullable = true)  | | |-- status: string (nullable = true)  | | |-- storageGroupList: string (nullable = true)  | | |-- storageid: string (nullable = true)  |-- sublabel: string (nullable = true)  |-- ts: string (nullable = true)  

Ответ №1:

Один из вариантов — создать класс Java для этого объекта JSON . Таким образом, вы можете прочитать входной JSON, и spark не выдаст ошибку во время чтения. Дубликаты разрешены в той мере, в какой определенная вами схема соответствует входной схеме.

 spark.read()  .schema(Encoders.bean(YourPOJO.class).schema())  .option("encoding", "UTF-8")  .option("mode", "FAILFAST")  .json("data.json")  .as(Encoders.bean(YourPOJO.class));  }