如何在Hive表中忽略CSV单双引号?配置SerDe后值存为NULL
解决OpenCSVSerDe解析CSV时字段为NULL的问题
我来帮你排查这个字段被解析成NULL的问题,核心原因是你的OpenCSVSerDe参数设置和CSV文件的格式不匹配,导致SerDe无法正确识别字段内容。
问题根源分析
你当前配置了escapeChar='"'和quoteChar='"',这两个参数的作用是:
quoteChar:用来包裹包含特殊字符(比如分隔符、转义符)的字段,默认是双引号。escapeChar:用来转义字段内部的quoteChar,比如当字段里需要出现双引号时,要用escapeChar把它转义成""(因为你的escapeChar和quoteChar都是双引号)。
而你的CSV内容是1, Hello"World,这里的Hello"World没有被quoteChar包裹,却包含了一个单独的双引号,SerDe会把这个双引号误认为是未闭合的字段包裹符,导致解析失败,最终把name字段设为NULL。
解决方案
下面提供两种可行的解决思路,你可以根据实际场景选择:
方案一:修正CSV文件格式(推荐,符合CSV规范)
按照OpenCSVSerDe的解析规则,包含双引号的字段需要用quoteChar包裹,并且字段内部的双引号要用escapeChar转义(也就是写成两个双引号)。修改后的CSV内容应该是:
1,"Hello""World"
保持原有的DDL不变,重新加载数据后,name字段就能正确解析为Hello"World。
方案二:调整SerDe的参数设置
如果你的CSV文件无法修改,或者不需要用双引号包裹字段,可以调整SerDe的属性:
- 把
quoteChar设置为一个不会出现在字段中的特殊字符,比如空字符或者其他符号,这样SerDe就不会把字段里的双引号当作包裹符处理。
修改后的DDL如下:
create table test (id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar'=',', 'escapeChar'='"', 'quoteChar'='\u0000' -- 使用空字符作为quoteChar,避免干扰字段内的双引号 ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
这样加载原CSV文件1, Hello"World时,SerDe会直接读取Hello"World作为name字段的值,不会解析成NULL。
内容的提问来源于stack exchange,提问作者Bhaskar
相关产品推荐
相关产品推荐

