Hive之distinct多字段中出现null问题

在使用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;

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,可依据具体场景选择使用。

你可能感兴趣的:(大数据)