繁体   English   中英

COPY INTO 带有额外列的雪花表

[英]COPY INTO Snowflake Table with Extra Columns

我在雪花中定义了一个表:

GLPCT

BATCH_KEY NUMBER(38,0) NULL
CTACCT VARCHAR(100) NULL
CTPAGE NUMBER(38,0) NULL

和一个看起来像这样的文件:

GLPCT.csv

CTACCT VARCHAR(100)
CTPAGE NUMBER(38,0)

例子:

CTACCT,CTPAGE
"Test Account",100
"Second Account", 200

我的复制到命令如下所示:

copy into GLPCT_POC from 'azure://ouraccount.blob.core.windows.net/landing/GLPCT' credentials=(azure_sas_token='<SAS_TOKEN') file_format=(TYPE=CSV, SKIP_HEADER = 1, FIELD_OPTIONALLY_ENCLOSED_BY='"'); 

问题

由于列号不匹配,Snowflake 抛出错误。 如何让 Snowflake 忽略文件中不存在的列而不抛出错误? 如果有帮助,我可以将BATCH_KEY移到表的末尾。

似乎可以使用 COPY INTO 语句指示要插入哪些列,因此我们的语句变为:

copy into GLPCT_POC (CTACCT, CTPAGE) from 'azure://ouraccount.blob.core.windows.net/landing/GLPCT' credentials=(azure_sas_token='<SAS_TOKEN') file_format=(TYPE=CSV, SKIP_HEADER = 1, FIELD_OPTIONALLY_ENCLOSED_BY='"');

由于这是一个外部文件,我们无法使用上一个答案中提到的转换。

Snowflake 允许您在文件格式中设置 ERROR_ON_COLUMN_COUNT_MISMATCH。

ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE 布尔值,指定如果输入数据文件中的分隔列(即字段)数与相应表中的列数不匹配,是否生成解析错误。

如果设置为 FALSE,则不会生成错误并继续加载。 如果文件加载成功:

如果输入文件包含的记录的字段数多于表中的列数,则匹配的字段将按文件中出现的顺序加载,而不加载其余字段。

如果输入文件包含的记录的字段数少于表中的列数,则表中不匹配的列将加载为 NULL 值。

https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html#type-csv

您可以在将数据与副本一起拉入查询时添加“转换”。 在这种情况下,您的转换可以是添加一个 NULL 列。

但是,为了使用此功能,您需要为外部源创建一个舞台

create or replace stage my_stage 
url='azure://ouraccount.blob.core.windows.net/landing/GLPCT'
credentials=(azure_sas_token='<SAS_TOKEN')
file_format=(TYPE=CSV, SKIP_HEADER = 1, FIELD_OPTIONALLY_ENCLOSED_BY='"');

copy into GLPCT_POC 
from (SELECT NULL, $1, $2 FROM @my_stage);

$1 和 $2 与文件中的列对齐,然后 select 子句中列的顺序与表中的列对齐。

这样做的额外好处是,如果您要重用该复制语句和/或阶段,则无需重复所有凭据和文件格式信息。

请参阅使用转换语法加载数据

复制到<div id="text_translate"><p>我正在尝试将数据从本地复制到雪花,我得到了</p><blockquote><p> snowflake.connector.errors.ProgrammingError: 001757 (42601): SQL 编译错误:表 'RAW_DATA' 不存在</p></blockquote><p>相同的代码在 Jupiter notebook 中有效,但在 vs code 中无效。 我的角色是 accountadmin,所以权限没有问题。</p><p> 我要运行的代码是这个</p><pre>COPY INTO RAW_DATA file_format=(FIELD_OPTIONALLY_ENCLOSED_BY ='"' skip_header=1)</pre></div>在雪花抛出表中不存在<table> </table>

[英]COPY INTO <table> in snowflake throws table does not exist

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM