读取 csv 文件时雪花句柄为空
Posted
技术标签:
【中文标题】读取 csv 文件时雪花句柄为空【英文标题】:snowflake handle null while reading csv file 【发布时间】:2021-06-05 08:59:18 【问题描述】:我正在尝试从 S3 加载 CSV 文件。它在雪花表的整数类型数据字段中有一个空值。 所以我尝试使用 IFFNULL 函数但得到错误。
Numeric value 'null' is not recognized.
例如当我尝试时
select IFNULL(null,0)
我的答案是 0。
但是当我尝试读取 CSV 文件时,同样的事情不起作用
select $1,$2,ifnull($2,0)
from
@stage/path
(file_format => csv)
我收到 null 无法识别的错误。 当 $2 为空时它会失败。
我的 csv 格式如下。
create FILE FORMAT CSV
COMPRESSION = 'AUTO' FIELD_DELIMITER = ','
RECORD_DELIMITER = '\n' SKIP_HEADER = 0
FIELD_OPTIONALLY_ENCLOSED_BY = '\042'
TRIM_SPACE = FALSE
ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE ESCAPE = '\134'
ESCAPE_UNENCLOSED_FIELD = '\134' DATE_FORMAT = 'AUTO'
TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('\\N');
基本上,我只是想在从舞台读取时将 null 转换为 0。
【问题讨论】:
【参考方案1】:null
字符串文字可以通过设置NULL_IF
来处理:
CREATE FILE FORMAT CSV
...
NULL_IF = ('null', '\\N');
【讨论】:
【参考方案2】:我使用了 Snowflake 文档中列出的第二个选项,指定 FIELD_OPTIONALLY_ENCLOSED_BY=NONE 和 EMPTY_FIELD_AS_NULL = FALSE 在这种情况下,我需要提供一个用于 NULL 的值 (NULL_IF=('NULL')
https://docs.snowflake.com/en/user-guide/data-unload-considerations.html
“通过将 FIELD_OPTIONALLY_ENCLOSED_BY 选项设置为 NONE(默认)来保持字符串字段未封闭,并将 EMPTY_FIELD_AS_NULL 值设置为 FALSE 以将空字符串卸载为空字段。
如果选择此选项,请确保使用 NULL_IF 选项为 NULL 数据指定替换字符串,以区分输出文件中的 NULL 值和空字符串。如果您稍后选择从输出文件加载数据,您将指定相同的 NULL_IF 值来标识数据文件中的 NULL 值。”
所以我的查询如下所示:
COPY INTO @~/unload/table FROM (
SELECT * FROM table
)
FILE_FORMAT = (TYPE = 'CSV' COMPRESSION = 'GZIP'
FIELD_DELIMITER = '\u0001'
EMPTY_FIELD_AS_NULL = FALSE
FIELD_OPTIONALLY_ENCLOSED_BY = NONE
NULL_IF=('NULL'))
OVERWRITE = TRUE;
【讨论】:
以上是关于读取 csv 文件时雪花句柄为空的主要内容,如果未能解决你的问题,请参考以下文章