通过Snowflake中的外部表处理CSV文件的NULL值

时间:2019-12-18 10:45:01

标签: snowflake-data-warehouse

我正在尝试使文件格式的NULL_IF参数应用于外部表时起作用。

我有一个源CSV文件,其中某些列中包含NULL值。源文件中的NULL以"\N"格式出现(文件中所有非数字值都用引号引起来)。这是原始csv的示例行,其中源系统中ModifiedOn值为NULL:

"AirportId" , "IATACode" , "CreatedOn"           , "ModifiedOn"
1           , "ACU"      , "2015-08-25 16:58:45" , "\N"

我定义了一种包含参数NULL_IF = "\\N"

的文件格式

以下select语句成功地将正确的行解释为包含NULL值。

SELECT $8
FROM @MyS3Bucket 
(
file_format => 'CSV_1', 
pattern => '.*MyFileType.*.csv.gz'
)

但是,如果我将相同的文件格式用于这样的外部表:

CREATE OR REPLACE EXTERNAL TABLE MyTable
MyColumn varchar as (value:c8::varchar)
WITH LOCATION = @MyS3Bucket
FILE_FORMAT = (FORMAT_NAME = 'CSV_1')
PATTERN = '.*MyFileType_.*.csv.gz';

每行都将\N作为值而不是NULL。

我认为这是由提供单个变体输出的外部表引起的,然后可以进一步拆分而不是直接在csv文件中显示各个列。

一种解决方案是像这样将NULL处理编码到外部视图中:

CREATE OR REPLACE EXTERNAL TABLE MyTable
MyColumn varchar as (NULLIF(value:c8::varchar,'\\N'))
WITH LOCATION = @MyS3Bucket
FILE_FORMAT = (FORMAT_NAME = 'CSV_1')
PATTERN = '.*MyFileType_.*.csv.gz';

但是,如果文件格式发生更改,而文件格式可以\应集中该NULL定义,则这使我有不得不重新编写大量外部表代码的风险。这也意味着必须逐列处理NULL转换,而不是逐个文件地处理,从而增加了代码复杂性。

有没有一种方法可以使NULL值通过外部表显示而无需通过列定义显式处理它们?

理想情况下,这可以通过文件格式对象来应用,但并非不可能更改原始文件的格式。

1 个答案:

答案 0 :(得分:0)

这是Snowflake的Gokhan。我可以重现此问题。我将与开发人员团队联系,询问“为什么NULL_IF不能按预期工作,或为什么在外部表上将其忽略”。我无法提供预计到达时间,但我正在关注该问题。

如果您有权获得Snowflake支持,最好就此问题提交支持案例,这样您就可以轻松地执行此过程。