最近经常在Hive上跑oralce 语句,虽然Hive执行语句大致相同,可是也有一些大坑..比如就是空值和null判断
在oralce 判断是否为空直接可以 xxx is null / xxx is not null;
而在Hive上是这种方式是不对的。得到的结果一定是错的。
hive中空值判断基本分两种
1.NULL 与 \N(当字段为NULL时,hdfs文件用\N表示)
Hive在底层数据中如何保存和标识NULL,是由 alter table xxx(数据表名) set serdeproperties('serialization.null.format' = '\N'); 参数控制的
比如:当字段=''时,存储为null,可利用命令
alter table xxx(数据表名) set serdeproperties('serialization.null.format' = '');
实现遇到''用null替换
2.'' 与 length(xx)=0
''表示的是字段内容不为null且为空字符串,此时用 xxx is null 是无法查询这种值的,必须通过 xxx='' 或者 length(a)=0 查询 ,所以这里就是坑了,当内容为空是,用 xxx is null 是没有用哒
然后解决了这个问题之后呢,也会出现hive上面是显示null,而把数据导出后变成\N
我自己的做法是把他做nvl操作,显示为''这样oracle的话也是为null/空....(前提是字段比较少,如果字段比较多的话,还是修改底层数据的保存标识吧)