簡體   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