将数据从Blob加载到Snowflake表

时间:2019-11-21 06:13:26

标签: snowflake-data-warehouse

我有一个.txt文件,文件中的第一行是列名。我想将此数据加载到Snowflake表中。

首先想到如何运行select语句以使用*查看文件中的所有列。我不想写t。$ 1,t。$ 2等...

类似于 SELECT t。 从'@ azure_blob_stage_poc / Dim_Date.txt'开始 ORDER BY 1; *

另外,当将数据加载到表中时,我必须忽略文件中的第一行,因为它包含列名。我需要类似的雪花脚本 从“ @ azure_blob_stage_poc / Dim_Date.txt”复制到POC.Dim_Date;

如果我不忽略第一行并尝试加载得到错误消息: “字段分隔符',”在期望记录分隔符“ \ n”时找到,文件'Dim_Date.txt',第2行,字符547行2,列“ DIM_DATE” [“ LOAD_DT”:55]如果要继续加载时遇到错误,请为ON_ERROR选项使用其他值,例如'SKIP_FILE'或'CONTINUE'。有关加载选项的更多信息,请在SQL客户端中运行'info loading_data'。“

1 个答案:

答案 0 :(得分:0)

请阅读COPY INTO <table>命令上的文档。

CSV部分具有一个名为SKIP_HEADER的参数,可用于跳过标题行。

您的“问题”包含的实际问题较少,但是其中的“如何”与文本文件发现相关。通常,这是ETL /集成工具为您执行的操作,但是显而易见的事情是在文本编辑器中查看文件。

我将通过读取完整记录作为单个字段并使用SPLIT_TO_TABLE()进行拆分来获取列列表:

CREATE OR REPLACE STAGE my_stage URL = 's3://<bucket>[/<path>/' CREDENTIALS = ( ... );
CREATE OR REPLACE FILE FORMAT TEST_TXT TYPE = CSV FIELD_DELIMITER = NONE;

SELECT
  LISTAGG('$'||INDEX||' "'||TRIM(VALUE, '"')||'"', ', ') WITHIN GROUP (ORDER BY INDEX) COLS
FROM '@my_stage/my_file' (FILE_FORMAT => 'TEST_TXT') x
CROSS JOIN LATERAL SPLIT_TO_TABLE(x.$1, ',') s
GROUP BY SEQ HAVING SEQ = 1;
    =>
$1 "Order date", $2 "Item code", $3 "Quantity"

然后我只需使用新的COLS将结果SELECT复制到新的FILE FORMAT

CREATE OR REPLACE FILE FORMAT TEST_TXT2
    TYPE = CSV SKIP_HEADER = 1 FIELD_OPTIONALLY_ENCLOSED_BY = '"';

SELECT $1 "Order date", $2 "Item code", $3 "Quantity"
FROM '@my_stage/my_file' (FILE_FORMAT => 'TEST_TXT2') x;

用于列名的特殊SQL构造*仅适用于命名记录集。无法将数据内容转换为SQL列名称。