Hive之distinct多字段中出现null问题
在使⽤Hive以多个字段作为唯⼀性依据进⾏统计时,如果某个字段出现⼤量null值,会发⽣统计结果不准确问题,解决办法可以使⽤coalesce函数对空值进⾏替换。
导致统计值异常的原因主要是因为:1. 所有的null值会被归并到⼀项;2. count结果并不会统计null项
品成语
假设原来是以及A,B两个字段去重后统计结果:玄武湖
lect count(distinct A,B) from tableName where xxx;
在实践中发现A,B都可能为空值,⽽且B值出现空值的概率⾮常⼤,在这种情况下,发现统计结果与预计相差较⼤。甚⾄在B值全为空时,统计结果为0,此时需要对A,B出现的空值,进⾏替换,⽐如下⾯将其替换为0;
实际上当A,B任⼀为NULL时, distinct结果项即为NULL(注意是NULL, 空字符串可以正常计数)
五行与颜色lect 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进⾏优化
上学路上的景色lect count(*) from (lect coalesce(A,'0'),coalesce(B,'0') from tableName where xx group by A,B)t;杜相
发烧腿疼>羊乳根
此外hive中还有order by,sort by, distribute by, cluster by,可依据具体场景选择使⽤。