在使用Hive以多个字段作为唯一性依据进行统计时,如果某个字段出现大量null值,会发生统计结果不准确问题,解决办法可以使用coalesce函数对空值进行替换。
导致统计值异常的原因主要是因为:1. 所有的null值会被归并到一项;2. count结果并不会统计null项
假设原来是以及A,B两个字段去重后统计结果:
select count(distinct A,B) from tableName where xxx;
在实践中发现A,B都可能为空值,而且B值出现空值的概率非常大,在这种情况下,发现统计结果与预计相差较大。甚至在B值全为空时,统计结果为0,此时需要对A,B出现的空值,进行替换,比如下面将其替换为0;
实际上当A,B任一为NULL时, distinct结果项即为NULL(注意是NULL, 空字符串可以正常计数)
select count(distinct coalesce(A,'0'),coalesce(B,'0')) from tableName where xxx;
关于coalesce函数
将空值替换成其他值,返回第一个非空值
COALESCE(expression_1, expression_2, ...,expression_n)
依次计算各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
关于Hive distinct
使用disticnt函数,所有的数据只会shuffle到一个reducer上,导致reducer数据倾斜严重,当数据量较大时,运行速度较慢。
可以通过group by进行优化
select count(*) from (select coalesce(A,'0'),coalesce(B,'0') from tableName where xx group by A,B)t;
此外hive中还有order by,sort by, distribute by, cluster by,可依据具体场景选择使用。