[英]COPY INTO Snowflake Table with Extra Columns
我在雪花中定義了一個表:
BATCH_KEY NUMBER(38,0) NULL
CTACCT VARCHAR(100) NULL
CTPAGE NUMBER(38,0) NULL
和一個看起來像這樣的文件:
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 子句中列的順序與表中的列對齊。
這樣做的額外好處是,如果您要重用該復制語句和/或階段,則無需重復所有憑據和文件格式信息。
請參閱使用轉換語法加載數據
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.