如何创建 csv 文件格式定义以将数据加载到雪花表中

时间:2021-02-01 01:41:30

标签: snowflake-cloud-data-platform snowflake-schema

我的 csv 文件示例如下所示: snowpipe 无法加载“文件 (5) 中的列数与对应表 (3) 的列数不匹配,请使用文件格式选项 error_on_column_count_mismatch=false 忽略此错误”

有人可以告诉我 csv 文件格式定义以适应加载吗?

enter image description here

3 个答案:

答案 0 :(得分:2)

问题在于您尝试加载的数据本身包含逗号 (,)。 Snowflake 认为这些逗号代表新列,这就是为什么它认为您的文件中有 5 列但只有 3 列。

您需要告诉 Snowflake 双引号 (") 内的任何内容都应按原样加载,而不是将引号内的逗号解释为列分隔符。

当您通过 Web 界面创建文件格式时,有一个选项可让您告诉 Snowflake 执行此操作。将“可选包含的字段”下拉列表设置为“双引号”,如下图所示:

enter image description here

或者,如果您使用 SQL 创建文件格式,则有一个名为 FIELD_OPTIONALLY_ENCLOSED_BY 的选项,您可以将其设置为 \042,它执行相同的操作:

CREATE FILE FORMAT "SIMON_DB"."PUBLIC".sample_file_format 
    TYPE = 'CSV' 
    COMPRESSION = 'AUTO' 
    FIELD_DELIMITER = ',' 
    RECORD_DELIMITER = '\n' 
    SKIP_HEADER = 0 
    FIELD_OPTIONALLY_ENCLOSED_BY = '\042' # <---------------- Set to double-quote
    TRIM_SPACE = FALSE 
    ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE 
    ESCAPE = 'NONE' 
    ESCAPE_UNENCLOSED_FIELD = '\134' 
    DATE_FORMAT = 'AUTO' 
    TIMESTAMP_FORMAT = 'AUTO';

答案 1 :(得分:0)

如果可能,请分享文件格式和一份示例记录以找出问题所在。列数似乎有问题,您能否在复制语句中包含 field_optionally_enclosed_by 选项并尝试一次。

答案 2 :(得分:0)

当 TAB 字符不太可能出现时,我倾向于使用 TAB 分隔的文件 - 这也 - 与标题一起 - 使源文件更具可读性,以防它们需要打开以解决加载失败:

FIELD_DELIMITER = '\t'

另外(虽然有点离题),请注意 Snowflake 建议压缩文件:https://docs.snowflake.com/en/user-guide/data-load-prepare.html#data-file-compression

我主要使用 GZip 压缩类型:

COMPRESSION = GZIP

一个(工作)示例:

CREATE FILE FORMAT Public.CSV_GZIP_TABDELIMITED_WITHHEADER_QUOTES_TRIM
    FIELD_DELIMITER = '\t'
    SKIP_HEADER = 1
    TRIM_SPACE = TRUE
    NULL_IF = ('NULL')
    COMPRESSION = GZIP
;
相关问题