基于S3 CSV的Amazon Athena表插入含逗号字符串被截断如何解决
解决方案
该截断问题的核心原因是基于CSV创建的Athena表默认未开启包含分隔符字段的引号识别规则,可按以下方案处理:
方案1:调整表SerDe配置(推荐,存量表适配成本最低)
如果你的表使用默认的LazySimpleSerDe解析CSV,先执行ALTER语句修改表的序列化配置,开启双引号作为字段包裹符:
ALTER TABLE <你的表名> SET SERDEPROPERTIES ( 'field.delim' = ',', 'quoteChar' = '"', 'escapeChar' = '\\' );
配置完成后,插入时用双引号包裹包含逗号的字符串即可,示例语句:
INSERT INTO table_names (id, key_string) VALUES (1, '"{key1=1,key2=3}"');
补充:如果建表时已经使用
org.apache.hadoop.hive.serde2.OpenCSVSerde作为解析器,默认已支持双引号包裹,无需修改表配置,直接用上述插入语法即可。
方案2:更换存储格式(适合新建表,长期使用更优)
如果表还在建设阶段,建议直接更换为Parquet、ORC这类列式存储格式,不存在分隔符截断问题,插入语句无需做任何转义处理,原写法可以直接运行:
INSERT INTO table_names (id, key_string) VALUES (1,'{key1=1,key2=3}');
方案3:特殊字符转义替换(临时应急方案)
如果不方便修改表配置,可以临时将字段内的逗号替换为业务不会用到的特殊字符,查询时再还原:
-- 插入时替换逗号为自定义特殊符号 INSERT INTO table_names (id, key_string) VALUES (1, REPLACE('{key1=1,key2=3}', ',', '^')); -- 查询时还原逗号 SELECT id, REPLACE(key_string, '^', ',') AS key_string FROM table_names;
内容的提问来源于stack exchange,提问作者Summer Fang
相关产品推荐
相关产品推荐

