首页 > 解决方案 > 如何在 OpenCSVSerde 中存储空值或避免 Hive 表的 LazySimpleSerde 中的引号字符

问题描述

我有一个关于 OpenCSVSerde 和 SimpleLazySerDe 的 Hive 中的 TBLProperties 的问题。

存储在文本文件中的数据文件(由 SQOOP 生成)

表属性

  1. 将数据存储为 OpenCSVSerde
  2. 分隔符由|
  3. 引用Char by"
  4. 转义符\\

问题是null值显示为空字符串""。然后我发现了这个

使用 OpenCSVSerde 将具有 NULL 的列写入某些字符串 - HIVE

我尝试关注该主题,但如果管道|存储在内容中,则出现一个问题,那么列将发生变化。

  1. 创建 OpenCSVSerde 表

CREATE TABLE `opencsv_serde`(   
  `a` string,
  `b` string,
  `c` string
)   
ROW FORMAT SERDE    
  'org.apache.hadoop.hive.serde2.OpenCSVSerde'  
WITH SERDEPROPERTIES (  
  'quoteChar'='\"',     
  'separatorChar'='|',
  'escapeChar'='\\'
)   
STORED AS INPUTFORMAT   
  'org.apache.hadoop.mapred.TextInputFormat'    
OUTPUTFORMAT    
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'  
  1. 创建 LazySimpleSerDe 表(我认为 quoteChar 不起作用)
CREATE TABLE `lazysimple_serde`(    
  `a` string,
  `b` string,
  `c` string
)   
ROW FORMAT SERDE    
    'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES (  
  'field.delim'='|',    
  'serialization.format'='|',
  'escapeChar'='\\',
  'quoteChar'='\"'
)

STORED AS INPUTFORMAT   
  'org.apache.hadoop.mapred.TextInputFormat'    
OUTPUTFORMAT    
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'  
TBLPROPERTIES('serialization.null.format'='');
  1. 将数据插入opencsv_serde
insert into opencsv_serde
select "a|a", "b", '"c|c"' union all
select "d|d", "e", null;
  1. 从 opencsv_serde 的结果中选择数据opencsv_serde

  2. 插入数据opencsv_serdelazysimple_serde

insert into lazysimple_serde
select * from opencsv_serde
  1. 检查lazysimple_serde 来自lazysimple_serde 的结果

在 LazySimpleSerDe 中发现列移位

我需要知道如何在 OpenCSVSerDe 中存储 null 或防止在 LazySimpleSerDe 中移动列

谢谢

标签: hadoophivehive-serde

解决方案


推荐阅读