redshift Операция выгрузки, вызывающая избыточные данные - PullRequest
1 голос
/ 09 июля 2020

Мы используем команды UNLOAD для выполнения некоторого преобразования внешних таблиц на основе s3 и sh публикации данных в другую корзину s3 в формате PARQUET.

Я использую опцию ALLOWOVERWRITE в операции выгрузки для замены файлов если они уже существуют. Это отлично работает в большинстве случаев, но иногда вставляет повторяющиеся файлы для одних и тех же данных, что заставляет внешнюю таблицу показывать повторяющиеся числа.

Например, если паркет в разделе 0000_part_00.parquet, который содержит полные данные . При следующем запуске ожидается, что unload перезапишет этот файл, но вместо этого вставит новый файл 0000_part_01.parquet, который удвоит общий вывод.

Это снова не повторится, если я просто очищу весь раздел и перезапущу его снова. Это несоответствие делает нашу систему ненадежной.

unload (<simple select statement>)
to 's3://<s3 bucket>/<prefix>/'
iam_role '<iam-role>' allowoverwrite
PARQUET
PARTITION BY (partition_col1, partition_col2);

Спасибо.

1 Ответ

0 голосов
/ 10 июля 2020

По моему опыту, параметр ALLOWOVERWRITE основан только на сгенерированных именах файлов: поэтому результат перезаписывается, только если 2 файла имеют одинаковое имя.

Этот параметр работает в большинстве случаев, но в этом домене "в большинстве случаев" недостаточно. С тех пор я перестал им пользоваться (и был очень разочарован). Вместо этого я вручную удаляю файлы с консоли S3 (или фактически перемещаю их в промежуточную папку), а затем выгружаю данные, не полагаясь на параметр ALLOWOVERWRITE.

Также упоминается в комментариях к этому ответу { ссылка }

...