Athena查询含正斜杠的带引号CSV数据时字段错位如何解决
问题根因
你当前使用的org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe本身不支持识别双引号包裹的字段边界,无论字段值是否被引号包裹,遇到配置的逗号分隔符就会直接切分字段,和斜杠解析规则无关。字段值内的逗号被误判为分隔符是字段错位的核心原因。
修复方案
无需调整现有ETL流程,仅修改Athena表的SerDe配置即可解决问题:
- 将当前使用的LazySimpleSerDe替换为Athena原生支持的
org.apache.hadoop.hive.serde2.OpenCSVSerde,该SerDe专为标准引号包裹的CSV格式设计,可自动识别引号边界,不会将引号内的逗号误判为字段分隔符 - 配置对应SerDe参数匹配你的数据规则:
separatorChar=,:指定字段分隔符为逗号quoteChar=":指定字段值的包裹符号为双引号escapeChar=/:指定数据内使用的转义字符为正斜杠,适配你现有数据的格式规则
参考DDL配置如下,已创建的表可通过ALTER TABLE SET SERDE和SET SERDEPROPERTIES语法更新配置,无需重新导入S3数据:
CREATE EXTERNAL TABLE IF NOT EXISTS your_target_table ( ColA bigint, ColB string, ColC string, ColD string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '"', 'escapeChar' = '/' ) STORED AS TEXTFILE LOCATION 's3://替换为你的S3数据路径/';
注意:OpenCSVSerDe读取数据时会先将所有字段按字符串类型解析,表定义中声明的bigint等非字符串类型,Athena会在查询时自动做类型转换,不影响最终查询结果。
内容的提问来源于stack exchange,提问作者Jake Bourne
相关产品推荐
相关产品推荐

