在Hive中将空白值转换为NULL

3

我正在尝试通过设置属性'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个回答

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      |
|                |
|                |
+-----------+--+

0

这个方法很实用: nullif(trim(b),'') 当b为空时返回NULL或者b的值。在查询语句中使用:

select a,nullif(trim(b),'') from test;

FYR: nullif( value 1, value 2 ) 如果value 1 = value 2,返回NULL;否则返回value 1(自Hive 2.3.0起)。 简写形式:CASE WHEN value 1 = value 2 then NULL else value 1

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

干杯!!


0
你可以尝试使用类似这样的语句将数据插入到表中:
CASE    
when TRIM(a) = ''
THEN NULL
ELSE a
END,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接