我有一个.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'。“
答案 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列名称。