Snowflake cloud data platform 通过Snowflake中的外部表处理CSV文件的空值

Snowflake cloud data platform 通过Snowflake中的外部表处理CSV文件的空值,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我试图获取文件格式的NULL_IF参数,该参数在应用于外部表时有效 我有一个在某些列中包含空值的源CSV文件。源文件中的空值以“\N”的格式显示(文件中的所有非数值都被引用)。以下是原始csv中的一行示例,其中源系统中的ModifiedOn值为NULL: "AirportId" , "IATACode" , "CreatedOn" , "ModifiedOn" 1 , "ACU" , "2015-08-25 16:58:45" , "\N" 我

我试图获取文件格式的NULL_IF参数,该参数在应用于外部表时有效

我有一个在某些列中包含空值的源CSV文件。源文件中的空值以
“\N”
的格式显示(文件中的所有非数值都被引用)。以下是原始csv中的一行示例,其中源系统中的ModifiedOn值为NULL:

"AirportId" , "IATACode" , "CreatedOn"           , "ModifiedOn"
1           , "ACU"      , "2015-08-25 16:58:45" , "\N"
我定义了一个文件格式,包括参数
NULL\u IF=“\\N”

下面的select语句成功地将正确的行解释为包含空值

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';
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';
每行都将
\N
作为值而不是NULL

我假设这是由于外部表提供了一个变量输出,该变量输出可以进一步拆分,而不是直接在csv文件中显示各个列

一种解决方案是将NULL处理编码到外部视图中,如下所示:

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';
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';
但是,如果文件格式发生更改,我就有可能不得不重新编写大量外部表代码,而文件格式可能会集中该空定义。这还意味着空转换必须逐列处理,而不是逐文件处理,从而增加了代码的复杂性

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


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

我能够重现该问题,而且它似乎是一个bug。如果您有权访问Snowflake支持,最好提交一份有关此问题的支持案例,以便您可以轻松地执行此过程。

在文件格式中,您有一个“空字符串”设置,默认设置为\\N。如果在下拉列表中将其更改为“NULL”,是否会出现相同的行为?我们已将CSV本身的格式设置为将NULL记录为\N,以便它与雪花默认值匹配。它只适用于选择和复制到,而不适用于外部表。我将进行编辑,以提供当前源的更清晰示例。