背景
源端数据在 Oracle 中, 迁移至 Hive 处理时对空值进行筛选.
提问: Hive 中 null 进行筛选时应如何判断 ?
在 Oracle 中判断是否为空, 可以直接使用 is null / is not null.
在 Hive 中使用同样方式得到的结果会有问题 (因为丢失了对空字符串 ''
的判断, 引号中没有空格).
本质
在 Oracle 中写入数据时没有空字符串 ''
的概念, 插入空串时写入为 null.
而 Hive 中既可以写入空字符串 ''
, 也可以写入 null.
探究
参考我们组大佬博客: hive中NULL值问题, 其中有详细的分析探究过程.
结论
在 hive 中字符类型的数据才会存在空串问题, 非字符类型数据的空串会被解析成 null.
解决
添加对字符型数据的清洗工作将空串 '' 转换为null
, 其上层引用时就可直接使用 is null / is not null 判断.
类似以下清洗替换:
CREATE TABLE A (id int,name string) STORED AS orc;
INSERT INTO TABLE B
SELECT
id as b_id,
case when name ='' then null else name as b_name --空串替换为null
FROM A;