【发布时间】:2019-05-08 06:34:54
【问题描述】:
我正在使用外部表将数据从存储在 blob 中的 csv 加载到 Azure SQL 数据仓库中的表。 csv 使用字符串分隔符(双引号),空字符串表示为 2 个双引号 ("")。
我希望表中的空列被视为 NULL。我使用的外部文件格式设置为 USE_TYPE_DEFAULT = FALSE,但这似乎不起作用,因为空列作为空字符串导入。并且只有当列是字符串,数字列正确转换为 NULL 时才会发生这种情况。
我还导入了一个不同的 csv,它没有使用不同的外部文件格式的字符串分隔符,并且那些空列被导入为 NULL。所以看起来它与 STRING_DELIMITER 选项有关。
csv:
col1;col2;col3;col4;col5;col6
"a";"b";"c";"1";"2";"3"
"d";"";"f";"4";"";"6"
外部文件格式的代码:
CREATE EXTERNAL FILE FORMAT eff_string_del
WITH (
FORMAT_TYPE = DELIMITEDTEXT
,FORMAT_OPTIONS(
FIELD_TERMINATOR = ';'
,STRING_DELIMITER = '0x22'
,FIRST_ROW = 2
,USE_TYPE_DEFAULT = False)
)
使用外部文件格式的表格代码:
CREATE EXTERNAL TABLE dbo.test (
col1 varchar(1) null
,col2 varchar(1) null
,col3 varchar(1) null
,col4 int null
,col5 int null
,col6 int null
)
WITH (
DATA_SOURCE = [EDS]
,LOCATION = N'test.csv'
,FILE_FORMAT = eff_string_del
,REJECT_TYPE = VALUE
,REJECT_VALUE = 0
)
查询外部表时的结果:
SELECT *
FROM [dbo].[test]
col1 col2 col3 col4 col5 col6
---- ---- ---- ----------- ----------- -----------
a b c 1 2 3
d f 4 NULL 6
有人可以帮我解释发生了什么或我做错了什么吗?
【问题讨论】:
-
UPDATE test SET col2=NULL WHERE col2 = ''是一个选项吗?我很少将文件直接插入目标表。我总是先上台然后清理/处理它。
标签: sql-server polybase