Итак, если у вас есть эта таблица в Snowflake:
create table t (x string, y string) as select '', null;
и вы копируете ее на внешний этап с помощью file_format csv, вы получите эту ошибку, если не установите field_optionally_enclosed_by с чем-то, отличным от none:
Невозможно выгрузить пустую строку без указания параметра формата файла field_optionally_enclosed_by.
поэтому предположим, что для него установлено значение "" ".
create stage some_stg
url='s3://<some-bucket>/<some-dir>'
file_format = (type = csv field_optionally_enclosed_by='"' compression = none)
credentials = (aws_role = '<your-arn-for-snowflake>')
Я уверен, что эта проблема воспроизводится с внутренней стадии, если вы не хотите возиться с тем, чтобы снежинка использовала ваше ведро s3.
Когда вы запускаете копию для таблицы t выше:
copy into @some_stg/t.csv from t overwrite = true;
вы получаете файл (t_0_0_0.csv), который выглядит следующим образом:
"","\N"
И после создания эквивалентной таблицы в postgres:
create table t (x varchar, y varchar);
Когда вы загружаете это в postgres с psql, скопируйте так:
psql -h <host> -U <user> -c "copy t from stdin with csv null '\N'" < t_0_0_0.csv
Содержимое t на postgres есть:
x, y
"","\N"
Теперь это имеет смысл, потому что снежинка помещает \ N в двойные кавычки, поэтому psql копия сохранилась. Если вы редактируете t_0_0_0.csv и удаляете двойные кавычки вокруг \ N:
"",\N
и запускаете psql копирование снова, тогда \ N правильно преобразуется в ноль
Похоже, что нет способа генерировать CSV-файл из снежинки, который поддерживает пустую строку и ноль, которые можно сохранить при загрузке в postgres. Я запутался с конфигами снежинки EMPTY_FIELD_AS_NULL и NULL_IF, которые в документации снежинки даже говорят об этой проблеме:
When unloading empty string data from tables, choose one of the following options:
Preferred: Enclose strings in quotes by setting the FIELD_OPTIONALLY_ENCLOSED_BY option, to distinguish empty strings from NULLs in output CSV files.
Это "различает" 1059 *sh "их, но не так, как psql copy можно использовать без предварительной обработки файла с помощью sed.
Кто-нибудь знает, как создать CSV снежинки, который сохраняет пустые строки и нули таким образом, что psql копия может воспроизвести?