即使使用org.apache.hadoop.hive.serde2.OpenCSVSerde

时间:2019-05-11 03:09:56

标签: hive hive-serde

我有一个带有DDL的外部表,如下所示:

CREATE EXTERNAL TABLE pathirippilly_db.serdeTest (Name varchar(50),Job varchar(50),Sex varchar(4))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES
(
    "separatorChar" = ",",
    "quoteChar"     = "\""
)
STORED AS TEXTFILE
location "/user/pathirippilly/hive_data_external/serdeTest";

使用上面的DDL创建表之后,我将如下插入数据:

insert into serdetest values('"AKHIL"','Engineer','Male');

但是即使在定义了opencsv serde之后,双引号也不会被转义(不会被删除)。这是我的问题

  1. 我要去哪里了
  2. 说,例如,如果要转义多个quoteChar,则需要从输入数据中删除单引号和双引号。如何使用opencsv serde实现此目的。
  3. 根据Apache [https://cwiki.apache.org/confluence/display/Hive/CSV+Serde#CSVSerde-Usage][1] 即使我没有定义quoteChar和escapeChar,它也应自动选择转义字符为“ \”的双引号,并应自动从数据中删除双引号。但是为什么它不会在我的代码中发生

1 个答案:

答案 0 :(得分:0)

第一个问题和第三个问题都相似-为什么不删除双引号?

这是因为在将数据直接插入表中时未使用SerDe。 SerDe代表Serializer / Deserializer,Hive使用它来读取/写入文件中的表行。

  

HDFS文件-> InputFileFormat->->反序列化器->   行对象

     

行对象->序列化程序->-> OutputFileFormat->   HDFS文件

尝试使用“ load”命令将数据插入到配置单元表中,您会看到它正在工作。

load data local inpath '/home/hive/test/test.csv' into table serdetest;

示例-test.csv

"AKHIL",Engineer,Male

有关更多详细信息,请检查Hive Wiki page

第二个问题-如何转义多个引号字符?

可以使用'RegexSerDe'完成。

CREATE EXTERNAL TABLE serdetest (Name varchar(50),Job varchar(50),Gender 
varchar(6))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
'input.regex' = '^\"(\\d+)\\W+\\W+(\\w+).*'
)
STORED AS TEXTFILE
location "/user/pathirippilly/hive_data_external/serdeTest";

注意:例如,语句中给出的正则表达式不是实际的。

希望这会有所帮助!