Redshift Spectrum表中CSV Serde丢弃CSV文件空格问题如何解决
问题原因说明
你遇到的空格被裁剪的情况不是OpenCSVSerde的固有局限,是其默认配置导致的:
- OpenCSVSerde内置
trimWhitespace属性,默认值为true,会自动裁剪所有字段前后的空白字符 - 你设置的
serialization.null.format=''会将裁剪后得到的空字符串识别为null,所以全是空格的字段最终返回null,即使移除该配置,裁剪后得到的空字符串也不是你需要的原始空格内容
可行的解决方案
方案1:直接修改OpenCSVSerde配置(优先推荐,实现最简单)
在SERDEPROPERTIES中添加trimWhitespace = 'false'即可关闭自动裁剪空格的逻辑,同时保留CSV引号解析的原生能力,不会额外引入引号到字段内容中。参考建表配置:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '"', 'trimWhitespace' = 'false' ) STORED AS textfile LOCATION 's3://bucketname/foldername' TABLE PROPERTIES ('skip.header.line.count'='1')
如果需要将全空格的字段识别为字符串而非null,按需调整serialization.null.format配置即可。
方案2:修正正则Serde的匹配规则
如果你需要使用正则Serde实现解析,修改正则规则为精确匹配引号内的内容即可避免引入多余引号,核心是用[^"]*匹配两个引号之间的所有非引号字符(含空格),避免贪婪匹配的边界问题。参考配置:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex' = '"([^"]*)","([^"]*)","([^"]*)"' ) STORED AS textfile LOCATION 's3://bucketname/foldername' TABLE PROPERTIES ('skip.header.line.count'='1')
之前正则配置异常的原因
你之前使用的(.*)是贪婪匹配规则,未明确匹配边界,会出现内容截取错误;将引号放入捕获组后虽然保留了空格,但也把引号作为字段内容的一部分返回,不符合预期。使用[^"]*明确限定捕获组仅匹配引号内部的内容,即可同时解决空格保留和多余引号的问题。
内容的提问来源于stack exchange,提问作者SwapSays
相关产品推荐
相关产品推荐

