Копирование таблицы снежинок с нулями и пустыми строками в CSV, которые можно импортировать с помощью команды psql copy. - PullRequest
2 голосов
/ 24 февраля 2020

Итак, если у вас есть эта таблица в 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 копия может воспроизвести?

1 Ответ

1 голос
/ 24 февраля 2020

Вы пробовали с опцией NULL_IF в вашем формате файла, следующий формат файла выгрузит ваши нулевые данные снежинки с пустым.

CREATE OR REPLACE FILE FORMAT UPDATED_FORMAT_NAME
TYPE = 'CSV'
COMPRESSION = 'NONE'
FIELD_DELIMITER =','
NULL_IF=()

Надеюсь, это поможет!

Большое спасибо, Срига

...