#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)); }