hive中关于distinct 问题的解决方案,求大神相助?

resin_404 2017-11-23 01:18:25
在hive数据仓库中,遇到如下sql语句
select
'20171021'
,a
,b
,c
,d
,e
,f
,g
,h
,i
,j
,k
,sum(xx)
,0
,sum(yy)
,0
,count(distinct User_Mobile_No)
,0
,count(distinct case when trim(stus_cd)='0' then User_Mobile_No else null end)
,sum(zz)
from temp1_t88_ech_txn_biz_stat
group by a,b,c,d,e,f,g,h,i,j,k
with cube
;

在count(distinct xx)语句和with cube在一个sql片段时,执行的数据量相对比较大。又因为有去重操作,导致整个sql耗时比较长,网上看到又UDAF函数collect_set() 可以解决distinct的问题,但是由于这个函数返回的是一个数组,当数据量特别大时已经超过的数据组存储量,sql会执行报错具体测试情况如下:

表中数据1.8G 维度字段11个 汇总字段count(distinct a)两个 集群节点38
对以上数据进行with cube计算
1.使用distinct 加上 set hive.new.job.grouping.set.cardinality = 2048; 计算通过
2.使用hive的UDAF函数size(collect_set(a)) 替换 count(distinct a) 上面设置参数取消,但是计算在reduce阶段耗时过长,不可用
3.使用自己开发的UDAF函数,和collect_set作用类似,执行在reduce阶段耗时过长,不可用
备注2,3种方法执行结果报错,导致内存溢出:GC overhead limit exceeded (collect_set内置函数返回一个数组,若返回数据量巨大,必然会导致内存溢出)
以上方法进行计算时,在reduce阶段都会导致计算的节点CPU过载,内存上升。

有没有和distinct功能类似的mapreduce程序可以用用。或者类似能解决这个问题的函数,提高一下sql语句的执行性能,减少耗时。还请大神帮助啊。。。
想知道hive源码里面怎样实现这个distinct的。。
...全文
1301 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
resin_404 2017-12-25
  • 打赏
  • 举报
回复
有没有大神帮帮忙啊

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧