在Hive中将Blank转换为NULL

时间:2016-04-01 10:50:10

标签: hive impala

我试图通过设置属性'serialization.null.format' = ''将源文件中的空白值转换为hive表中的NULL。我在hive中编写的查询是:

create table test(a int, b string) stored as parquet TBLPROPERTIES('serialization.null.format'='');

然后通过impala这样插入值:

insert overwrite table test values (1, ''), (2, 'b');

结果显示如下:

| a | b |


| 1 |   |

| 2 | b |

有人可以帮我解决为什么空白没有转换为NULL?

3 个答案:

答案 0 :(得分:1)

问题是Parquet SerDe。请参阅https://issues.apache.org/jira/browse/HIVE-12362上的问题。

描述如下:

create table src (a string);
insert into table src values (NULL), (''), ('');

0: jdbc:hive2://localhost:10000/default> select * from src;
+-----------+--+
| src.a  |
+-----------+--+
| NULL      |
|                |
|                |
+-----------+--+

create table dest (a string) row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' stored as INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat';

alter table dest set SERDEPROPERTIES ('serialization.null.format' = '');
alter table dest set TBLPROPERTIES ('serialization.null.format' = '');
insert overwrite table dest select * from src;

0: jdbc:hive2://localhost:10000/default> select * from test11;
+-----------+--+
| test11.a  |
+-----------+--+
| NULL      |
|                |
|                |
+-----------+--+

答案 1 :(得分:0)

您可以尝试使用如下语句插入表中:

CASE    
when TRIM(a) = ''
THEN NULL
ELSE a
END,

答案 2 :(得分:0)

这可以解决问题: nullif(trim(b),'') 空白时将给出b或NULL值。因此,在选择语句时,您可以

从测试中选择a,nullif(trim(b),'');

FYR: nullif(value 1,value 2)如果值1 =值2,则返回NULL;否则,返回NULL。否则返回值1(从Hive 2.3.0开始)。 速记:当值1 =值2则为NULL,否则为值1

https://www.docs4dev.com/docs/en/apache-hive/3.1.1/reference/LanguageManual_UDF.html

干杯!