先说基础知识
hive中空值分两种
(1)NULL
hive中null实际在HDFS中默认存储为’\N’,通过查询显示的是’NULL’。
这时如果查询为空值的字段可通过语句:# is null 或者 # =’\N’ 实现。
此时可用hive中与null有关的函数,如nvl,coalesce,is null等判断是否为null是为true。
产生NULL值,一般都是由hive外链接引起的。
(2)”
” 表示的是字段不为null且为空字符串,此时用 # is null 是无法查询这种值的,必须通过 # ==” 或者 length(#)=0 查询
产生”值,一般都是源数据为空。
之前项目中用到sqoop工具从HDFS中往数据库中导数据时,任务失败。不得已,用二分法导数据,去排查问题,看看是哪一条数据导致任务报错。最后排查到数据文件中有字段的值为空。但是奇怪的是,在hive sql里面已经加为null判断了。再看数据文件,发现其中的值不是通常的NULL,或者是\N,而是”。
所以得到原因,用判断null的nvl函数并不能排除”的情况,需要用IF(# == ”,’未知’,#) AS # 来判断。