前些阵子在公司做项目遇到了一个问题,就是需要都行业中的所有品牌的uid进行去重的然后计数的操作。
数据量去完重复大概2个亿,去之前大概将近三个亿。
做法一:最原始的做法使用的是count(distingct uid)这个需要大概跑3个小时的任务。
做法二:使用group by去重,效果依然不好。
做法三:使用row_number() over(partition by uid order by uid desc) as rn ,然后取rn=1,这样也不行。
通用做法:将任务分成5份,即uid%5=0,1,2,3,4这几个任务去跑,然后进行union all和并即可。任务从三小时降到0.5小时。
代码:开启5个以下任务,uid%5=0,1,2,3,4 五种情况 ,写到wb_ad_brand_industry_count_temp1,2,3,4,5
#!/bin/bash
source /usr/local/jobclient/config/.hive_config.sh
source /usr/local/jobclient/lib/source $0 $1
source /usr/local/jobclient/demo/execute_modular.sh $work_log_notice
source ./mys