explode_outer разбивает столбец на 2 строки, если один из параметров json имеет значение с » n» в нем

#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.