gpt4 book ai didi

string - 将带有空值和空字符串的雪花表复制到可以使用 psql copy 命令导入的 csv

转载 作者:行者123 更新时间:2023-12-03 19:16:19 25 4
gpt4 key购买 nike

所以,如果你在 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);
当您使用 psql 副本将其加载到 postgres 时,如下所示:
psql -h <host> -U <user> -c "copy t from stdin with csv null '\N'" < t_0_0_0.csv
postgres上t的内容是:
x, y
"","\N"

现在这是有道理的,因为雪花将\N 放在双引号中,所以 psql 副本保留了它。如果您编辑 t_0_0_0.csv 并删除\N 周围的双引号:
"",\N
并再次运行 psql copy 然后\N 正确转换为 null

似乎没有一种方法可以从支持空字符串和 null 的雪花生成 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.

它确实“区分”了它们,但不是 psql copy 可以使用而无需事先用 sed 操作文件的方式。

有谁知道如何生成雪花 csv 以 psql 副本可以重现的方式保留空字符串和空值?

最佳答案

您是否尝试过在您的文件格式中使用 NULL_IF 选项,以下文件格式将卸载您的雪花空数据。

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

关于string - 将带有空值和空字符串的雪花表复制到可以使用 psql copy 命令导入的 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60372409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com