我正在尝试从 Snowflake 卸载一个 CSV 文件,其中只有非空值被引号括在双引号中。
这是我的桌子
|BizName |BizOwner |
|----------+-------------------|
| "NiceOne" LLC | Robert |
| GoodRX | |
| MaxLift | Brian |
| P,N and B | Jane |
+----------+--------------------
这是我想要的输出 -
"""NiceOne"" LLC","Robert","GoodRX",,"Maxift","Brian","P,N and B","Jane"
以下是我尝试过的 2 种格式示例
我尝试使用以下格式,它将空值括在引号中
create or replace file format formatA
COMPRESSION = GZIP
RECORD_DELIMITER = ','
SKIP_HEADER = 1
FIELD_DELIMITER = NONE
FILE_EXTENSION = 'csv'
ESCAPE = NONE
ESCAPE_UNENCLOSED_FIELD = NONE
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ( '','NULL' , 'null' , '""' )
EMPTY_FIELD_AS_NULL = TRUE
copy into @mytablestage from mytable FILE_FORMAT = ( FORMAT_NAME = 'formatA' ) ON_ERROR = CONTINUE
我尝试了以下格式,它没有用引号括起来
create or replace file format formatB
COMPRESSION = GZIP
RECORD_DELIMITER = ','
SKIP_HEADER = 1
FIELD_DELIMITER = NONE
FILE_EXTENSION = 'csv'
ESCAPE = NONE
ESCAPE_UNENCLOSED_FIELD = NONE
NULL_IF = ( '','NULL' , 'null' , '""' )
EMPTY_FIELD_AS_NULL = TRUE
copy into @mytablestage from mytable FILE_FORMAT = ( FORMAT_NAME = 'formatB' ) ON_ERROR = CONTINUE
查看所需的输出,字段分隔符和记录分隔符不能相同,以区分行和字段。选择不同的记录分隔符,FIELD_OPTIONALLY_ENCLOSED_BY = '"' 和 NULL_IF = ( ''', 'NULL' , 'null' , '"' ( 应该会给你所需的输出。
您可以使用 Snowflake 文档中指定的第二个选项:
https://docs.snowflake.com/en/user-guide/data-unload-considerations.html
您可以指定FIELD_OPTIONALLY_ENCLOSED_BY=NONE
和EMPTY_FIELD_AS_NULL = FALSE
在这种情况下,您需要提供用于 NULL 的值 (NULL_IF=('NULL')
(。
通过将 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;
这为我节省了必须另外处理文件以摆脱封闭引号的烦人部分。