Redshift加载CSV时空字符串与NULL混淆问题及COPY命令疑问
问题
我有一个CSV文件,其中同时包含NULL值(表现为连续两个分隔符)和空字符串(用""表示)。希望将其原样加载到Redshift中,即空字符串保留为"",NULL值加载为NULL。但使用以下COPY命令加载后,Redshift表中没有NULL值,全部变为空字符串,请问这是为什么?
CSV示例
283858817256731,"",2023-01-01 04:25:47.686607,2023-01-01 04:25:47.686038,,,, 151e1e6d75455b17b43e2,"",2023-01-01 04:26:59.284768,2023-01-01 04:26:59.284354,,,, 3005867602921,"",2023-01-01 04:32:37.476288,2023-01-01 04:32:42.347546,,,"", 300450878333,"",2022-12-30 07:56:45.10391,2023-01-28 06:34:11.616317,,,"", 3005869211328,"",2023-01-01 04:35:35.413979,2023-01-01 04:35:50.054747,,,"", 2830888423936,,2023-01-01 04:36:50.889579,2023-01-01 04:36:50.889177,,"",,
原COPY命令
COPY jwan.users_birth_dates_s3_copy FROM 's3://...<some path>' iam_role <some role>; CSV
原因与解决办法
原因
Redshift的COPY命令在默认CSV模式下,会将连续分隔符之间的无引号空值和**带引号的空字符串""**统一解析为空字符串,因为默认没有指定区分两种空值类型的规则,导致你要的NULL值被当成了空字符串处理。
解决办法
需要在COPY命令中添加NULL AS ''参数,明确指定:未被引号包裹的空值(即连续分隔符)解析为Redshift的NULL,而带引号的""则保留为空字符串。
修改后的COPY命令:
COPY jwan.users_birth_dates_s3_copy FROM 's3://...<some path>' iam_role <some role> CSV NULL AS '';
执行这条命令后,CSV中连续分隔符的位置会被加载为Redshift的NULL值,""则会保留为空字符串,符合你的需求。
内容的提问来源于stack exchange,提问作者Jwan622
相关产品推荐
相关产品推荐

