我正在尝试使文件格式的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值通过外部表显示而无需通过列定义显式处理它们?
理想情况下,这可以通过文件格式对象来应用,但并非不可能更改原始文件的格式。
答案 0 :(得分:0)
这是Snowflake的Gokhan。我可以重现此问题。我将与开发人员团队联系,询问“为什么NULL_IF不能按预期工作,或为什么在外部表上将其忽略”。我无法提供预计到达时间,但我正在关注该问题。
如果您有权获得Snowflake支持,最好就此问题提交支持案例,这样您就可以轻松地执行此过程。