Как вывести столбец Spark ArrayType в .csv для Postgres - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь вставить искровой фрейм данных в Aurora RDS Postgres.

Допустим, DF имеет 2 столбца и выглядит следующим образом: | ID |MyArr> |

Мой текущий конвейер состоит из записи кадра данных в S3 в виде .csv, а затем вставки этого .csv в Aurora RDS Postgres с помощью COPY.

Проблема, с которой я столкнулсянатолкнулся на то, что мой фрейм данных содержит столбец ArrayType (of strings).

Вопросы:

  • Есть ли лучший подход, который полностью пропускает S3?или подход, который использует что-то вроде посредника в формате .parquet?(похоже, что postgres не поддерживает простой способ массовой загрузки файлов паркета, что я и использовал при текущем подходе)
  • Предполагая, что ответ на вышеприведенный ответ отрицательный, я знаю, что могу использовать collect_ws() для объединения массива, но выходной формат выглядит следующим образом: "A,B,C" когда мне нужно, чтобы он выглядел следующим образом "{A,B,C}" (это форматирование массива csv, понятное Postgres).Я мог бы использовать UDF, но я ограничен работой в PySpark, поэтому я действительно предпочел бы избегать UDF, так как этот файл на самом деле довольно большой.

1 Ответ

0 голосов
/ 23 сентября 2019

Ах, хорошо - отвечаю на часть 2 моего собственного вопроса.Отредактирует, если кто-нибудь ответит на часть 1.

Я могу просто использовать regexp_replace() для вставки '{' и '}' после вызова collect_ws()

Примерно так:

        myDF \
        .withColumn('MyArr', regexp_replace('MyArr', '\A', '{')) \
        .withColumn('MyArr', regexp_replace('MyArr', '\Z', '}'))

РЕДАКТИРОВАТЬ : После тестирования этот подход не является стартовым, поскольку он значительно замедляет время выполнения (массив может потенциально быть огромным, порядка десятков тысяч GUID).

...