AWS Glue/Athena CSV双引号与逗号解析问题求助
看起来你遇到的问题是OpenCSVSerde没有正确识别引号内的逗号,导致字段被错误拆分。我来帮你排查并解决这个问题:
1. 先确认表结构与CSV字段数匹配
你的CSV每行实际包含3个字段:
- 第一个字段:
reference - 第二个字段:
address V7T452F4H9 - 第三个字段:
12410 W 62TH ST, AA D(被双引号包裹,内部逗号是内容的一部分)
如果你的表定义列数少于3,Serde会把引号内的逗号当成字段分隔符,导致结构混乱。请确保表的列数与实际字段数一致,比如:
CREATE EXTERNAL TABLE IF NOT EXISTS your_table ( reference STRING, address_identifier STRING, full_address STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'quoteChar' = '"', 'separatorChar' = ',' ) LOCATION 's3://your-bucket/path/to/files/';
2. 检查CSV文件的格式合法性
- 确保所有包裹特殊字符的双引号是英文半角引号,没有全角引号或其他特殊字符
- 确认每个带引号的字段都是成对闭合的,没有缺失结尾引号的情况
- 检查文件中是否存在隐藏的换行符或不可见字符(可以用文本编辑器的"显示所有字符"功能查看)
3. 补充Serde配置的escapeChar参数
虽然你的场景中没有转义的引号,但有些版本的OpenCSVSerde需要显式指定escapeChar才能正确解析带内部逗号的字段。尝试添加这个配置:
WITH SERDEPROPERTIES ( 'quoteChar' = '"', 'separatorChar' = ',', 'escapeChar' = '"' -- 用双引号转义双引号,符合CSV标准格式 )
4. 临时手动处理字段(绕过Serde问题)
如果以上步骤都无效,你可以在查询中手动处理字段,先替换引号内的逗号再拆分:
SELECT split_part(cleaned_line, ',', 1) AS reference, split_part(cleaned_line, ',', 2) AS address_identifier, regexp_replace(split_part(cleaned_line, ',', 3), '^"|"$', '') AS full_address FROM ( SELECT regexp_replace(line, ',"([^"]+),([^"]+)"', ',\\1~\\2') AS cleaned_line FROM (SELECT cast(line AS VARCHAR) FROM your_raw_table) t ) t2;
这个查询先把引号内的逗号替换成临时符号~,拆分后再去掉前后引号,能临时绕过Serde的解析问题。
内容的提问来源于stack exchange,提问作者ln9187
相关产品推荐
相关产品推荐

