Pyspark: исключение при чтении данных JSON, содержащих обратную косую черту

#apache-spark #pyspark #apache-spark-sql

#apache-spark #pyspark #apache-spark-sql

Вопрос:

У меня возникла проблема с чтением JSON из кода Spark SQL в PYSPARK. Объект JSON имеет формат, как показано ниже. Существуют некоторые структурные типы \ данных, и когда я пытаюсь прочитать эти данные, я получаю исключение.

{ «SalesManager»:»{«Email»: «abc@xyz.com «}», «colb»: «некоторое значение» }

Я пытался добавить 'serialization.format' = '1','ignore.malformed.json' = 'true' , но это не помогло.

Исключение:

обратный вызов (последний последний вызов): файл «», строка 1, в файле «/usr/lib/spark/python/pyspark/sql/dataframe.py «, строка 380, в show print(self._jdf.showString(n, 20, по вертикали)) Файл «/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py «, строка 1257, в файле вызовов «/usr/lib/spark/python/pyspark/sql/utils.py «, строка 63, в deco возвращает файл f(*a, **kw) «/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py «, строка 328, в get_return_value py4j.protocol.Py4JJavaError: произошла ошибка при вызове o365.showString. : org.apache.spark.SparkException: задание прервано из-за сбоя этапа: задание 0 на этапе 5.0 не удалось 4 раза, последний сбой: потерянная задача 0.3 на этапе 5.0 (TID 283, ip-10-0-1-92 .ec2.internal, исполнитель 119): java.lang.Исключение IllegalArgumentException: данные — это не JSONObject, а java.lang.Строка со значением {«Email»:»abc@xyz.com «} в org.openx.data.jsonserde.objectinspector.JsonStructObjectInspector.getStructFieldData(JsonStructObjectInspector.java:73)

Комментарии:

1. Похоже, что образец, которым вы поделились, находится не в правильном формате JSON. Я думаю, это должно быть похоже { "SalesManager":"{"Email":"abc@xyz.com"}", "colb":"somevalue" } , а во-вторых, вы хотите игнорировать такие случаи (которые имеют дополнительный символ «) или хотите преобразовать их в правильный формат?

2. извините, опечатка в моем вводе, правильный формат такой, как здесь — { «SalesManager»:»{«Email «: «abc@xyz.com «}», «colb»: «некоторое значение» } . Мне нужно игнорировать такие случаи

3. Хорошо, вы также можете отредактировать вопрос и изменить формат. Вы пробовали настройку .option("mode", "DROPMALFORMED") ?

4. Конечно, я изменю вопрос. Я не хочу использовать dropmalformed . Что я пытаюсь сделать, так это то, что я читаю из json и возвращаюсь к другому сегменту s3 как «json». Однако при записи он записывает некоторые поля с «», рассматривая его как StringType() . Либо я не хочу избегать записи с помощью «», ЛИБО читать json, содержащий «», и игнорировать специальные символы.

5. Хорошо, я вижу, в определении структуры, каков тип поля SalesManager ? Я предполагаю, что вы определили его как String, хотя оно не должно определяться как String . Я думаю, вам следует определить вложенный тип для этого ключа ( SalesManager ), который имеет только поле Email . Поэтому, когда Spark преобразует фрейм данных в JSON, можно сделать вывод, что значением SalesManager является JSONObject, а не String, и не будет добавлять символ «.