hive sql 优化

1、COUNT(DISTINCT)优化

原始语句运行时间大概215秒

select dt,
count(distinct case when page='2001'  then uuid end) as cleanUser
from dw_space_page_orc_dt 
where dt>='20170506'

优化之后语句运行时间大概155秒

select sum(t2.uuid_group) cleanUser from 
	(select t1.tag, count(1) uuid_group from 
		(select uuid,  cast(RAND() * 100 AS BIGINT) tag from dw_space_page_orc_dt where page='2001' and dt>'20170506' group by uuid) t1 group by tag) t2;

  1. 第一层SELECT:对uuid进行去重,并为去重后的uuid打上整数标记
  2. 第二层SELECT:按照标记进行分组,统计每个分组下uuid的个数
  3. 第三层SELECT:对所有分组进行求和

上面这个方法最关键的是为每个uuid进行标记,这样就可以对其进行分组,分别计数,最后去和。如果数据量确实很大,也可以增加分组的个数。例如:CAST(RAND() * 1000 AS BIGINT) tag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值