读取 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 文件时雪花句柄为空的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 csv 文件加载到雪花数据库时出现“在预期解析列时到达记录结尾”错误

使用 SAS 令牌从 Azure 阶段读取时出现雪花错误

如何拆分 CSV 或 JSON 文件以获得最佳雪花摄取?

将 CSV 数据加载到雪花表

Snowflake - 读取实现的架构

如何在雪花中将时间戳转换为日期