使用OpenCSVSerde编写具有NULL作为字符串的列 - HIVE

时间:2017-03-28 00:02:42

标签: hive

我正在使用' org.apache.hadoop.hive.serde2.OpenCSVSerde'编写hive表数据。

CREATE TABLE testtable ROW FORMAT SERDE  'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ","
  "quoteChar"     = "'"
   )  
STORED AS TEXTFILE LOCATION '<location>' AS
select * from foo;

所以,如果&#39; foo&#39; table中有空字符串,例如:&#39; 1&#39;,&#39; 2&#39;,&#39;&#39; 。空字符串按原样写入文本文件。文本文件中的数据为“&#39; 1&#39;&#39; 2&#39;&#39;&#39;

但如果&#39; foo&#39;包含空值,例如:&#39; 1&#39;,&#39; 2&#39;,null。空值不会写入文本文件中。 文本文件中的数据为&#39; 1&#39;&#39; 2&#39;,

如何确保使用csv serde将空值正确写入文本文件。写为空字符串或任何其他字符串说&#34; nullstring&#34;?

我也试过这个:

CREATE TABLE testtable ROW FORMAT SERDE
....
....  
STORED AS TEXTFILE LOCATION '<location>'
TBLPROPERTIES ('serialization.null.format'='')
AS select * foo;

虽然这可能应该用null替换空字符串。但这甚至不能做到。

请指导我如何将空值写入csv文件。

我是否必须检查select查询本身中的列的空值,如(NVL或其他),并将其替换为某些内容?

1 个答案:

答案 0 :(得分:1)

打开CSV Serde忽略&#39; serialization.null.format&#39;属性,您可以使用以下步骤处理空值

1. CREATE TABLE testtable 
    (
    name string,
    title string,
    birth_year string
    )ROW FORMAT SERDE  'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
    "separatorChar" = ","
    ,"quoteChar"     = "'"
    )
    STORED AS TEXTFILE;

2. load data into testtable

3. CREATE  TABLE testtable1
(
name string,
title string,
birth_year string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
TBLPROPERTIES('serialization.null.format'='');

4. INSERT OVERWRITE TABLE testtable1 SELECT * FROM testtable