#apache-spark #pyspark #explode #outer-join
#apache-spark #pyspark #разорвать #внешнее соединение
Вопрос:
Я пытаюсь запустить блокнот spark, в котором я пытаюсь обработать файл json, содержащий массив json в одном из столбцов с именем «данные» :
[{"payload":"here to check 1.n checking again 1", "key1": " value1"},
{"payload":"here to check 2.n checking again 2", "key1": " value2"}]
Я использую explode_outer()
для разделения столбца «данные» на разные строки, где каждый json в массиве составляет 1 строку. Поэтому я ожидаю 2 строки в качестве результатов.
Проблема в том, что вместо 2 строк я получаю 4 строки. Похоже, что он разделяется на "n"
в параметре «полезная нагрузка» json. Кто-нибудь может подсказать мне, как это исправить?
например: json:
{"alldata" : [{"payload":"here to check 1.n checking again 1", "key1": " value1"},
{"payload":"here to check 2.n checking again 2", "key1": " value2"}], "alldata1": "any"}
код:
var load = spark.read.schema(schema).json(path);
var queryValTemp = load.select(
col("alldata1"),
explode_outer(col("alldata")).as("explode_data")
);
queryValTemp.show();
Комментарии:
1. @ollik1: Я не уверен, что он дублируется, потому что я могу прочитать данные в правильный столбец. n находится в пределах значения одного из параметров json, и проблема возникает только при вызове метода explode
2. у вас есть воспроизводимый пример проблемы?
3. @ollik1: Я отредактировал вопрос с помощью примера кода
4. Хорошо, убрал флаг дублирования. Для меня пример работает так, как ожидалось, получая две строки в качестве выходных данных.
5. как насчет того, если n находится в конце строки.
{"alldata" : [{"payload":"here to check 1.n checking again 1n", "key1": " value1"}, {"payload":"here to check 2.n checking again 2n", "key1": " value2"}], "alldata1": "any"}
Ответ №1:
Из того, что я обнаружил, если в столбце с json есть n; вызов explode_outer() разделит один столбец на 2 строки вместо 1. Единственный способ решить эту проблему — перед вызовом explode_outer():
- вызовите to_json() для столбца
- Замените All() на удаление n.
- вызовите from_json() для результата replaceAll.