1.Prestoä¸SUM/COUNT踩å
2.小技巧一:把roaring bitmap引入hive/spark,再也不怕count(distinct)了
3.Hive常ç¨ç®åå®ç°åçç®è¿°--MapReduceç
Prestoä¸SUM/COUNT踩å
åå ï¼å¨prestoä¸ï¼ä¸¤ä¸ªvalueç¸é¤ï¼è³å°æä¸ä¸ªä¸ºæµ®ç¹æ°æè½è¿åæ£ç¡®ç»æ
解å³æ¹æ¡ï¼è½¬ä¸ºæµ®ç¹å
ï¼1ï¼select sum(case when storecode = '' then 1 else 0 end)*1. / count(1) from orders;
ï¼2ï¼cast(value AS type)
select * from table where date=
å¨hiveä¸æ£å¸¸æ§è¡ï¼prestoä¸ä¼æ¥éï¼operator equal(varchar, bigint) are not registered
åå ï¼Prestoä¸æ¯æéå¼è½¬æ¢ï¼è¦æ±ä»ä¹æ ¼å¼çåæ°ï¼å°±ä¸å®å¾æ¯ä»ä¹æ ¼å¼çåæ°
æ¹ä¸ºselect * from table where date=ââ
å¨kylinä¸è·sum()/count() åå¨prestoä¸è·ç¸åçsum/countç»æä¸ä¸è´,åå åæ:åç°å¨kylinä¸countå段æ¯ä¸å¿½ç¥nullå¼ç,åºè¯¥æä¹è§£å³kylinä¸çè¿ä¸ªé®é¢(KYLINä¸æ²¡æavgå½æ°,çæ¯ä¸å¤ç¨)
ç®åçæ¹æ³æ:
éæ°æ建ä¸ä¸ªcube(忽ç¥nullå¼ç)
æ´æ¹avgçå£å¾é®é¢(ä¸å¯å....)
æ´æ¹cubeä¸nullå段çæ°æ®ç±»å
小技巧一:把roaring bitmap引入hive/spark,再也不怕count(distinct)了
小技巧一:引入Roaring Bitmap到Hive/Spark,解决count(distinct)问题
在SQL中,`count(distinct xxx)`常用于计算去重数量。当`xxx`为byte,jspwriter源码 shortint, int等数值类型时,可以将其转化为bitmap位运算,加速运算。对于非数值类型,可以考虑将其转换为一个唯一的数字,构建广义字典。Roaring Bitmap的基本思想是使用一个位图来唯一标记某个正整数,用于记录无重复的整数数组。
例如,数组[2,3,4,5]可以通过一个字节记录。通过依次设置数字n在第n+1个位置的位,可以表示数组。值得买网源码对于数字范围0到n,需要`n/ +1`字节的存储空间。与数组存储相比,Roaring Bitmap的存储空间通常更小,约为数组的1/。
Roaring Bitmap适用于无法直接存储的其他类型数字,通过转换为唯一数字进行存储。在处理如`[0,javashop4源码]`的场景中,使用Roaring Bitmap需要字节的空间,而数组存储只需要8字节,因此不划算。Roaring Bitmap在底层采用数组存储,以适应数字分散的场景。
当处理如`[0,]`和`[,0]`的场景时,Roaring Bitmap可能无法区分数字顺序或正确识别重复值。在大数据领域,客服聊天系统源码如活跃人数等去重指标的计算中,Roaring Bitmap可以加速计算过程,尤其是在离线执行引擎Hive/Spark中引入Roaring Bitmap来实现精准去重。
考虑到Hive本身不支持Roaring Bitmap数据类型,可以将其序列化为`binary`类型使用。在函数体系方面,需要实现一系列的UDF和UDAF函数,如`bitmap_count`、企业网络源码`bitmap_and`、`bitmap_not`、`bitmap_union`、`bitmap_contains`、`range_bitmap`、`bitmap_to_array`、`array_to_bitmap`等,以支持bitmap的集合计数、交集、差集、并集和查询操作。
在留存分析场景中,可以利用Roaring Bitmap构建活跃位图来加速计算,如连续N天登录问题。通过将用户活跃日期构建为位图,可以快速判断用户是否连续活跃。在用户画像和用户圈选场景中,Roaring Bitmap可以用于构建用户活跃画像,提高数据处理效率。在电商场景中,通过构建轻度汇总表并使用Roaring Bitmap存储去重人数,可以有效避免重复计算,提高数据聚合的准确性。
对于大数值范围(如bigint),Roaring Bitmap也支持。考虑到实际应用中数值范围超过`2**`的情况较少,是否需要支持bigint取决于具体需求。在数据索引优化方面,可以考虑重新编码,使得连续分布,进一步提高查询性能。
Hive常ç¨ç®åå®ç°åçç®è¿°--MapReduceç
Hiveä¸ç常ç¨ç®åå æ¬distinctãjoinãgroup byãorder byãdistribute byãsort byãcountçï¼è¿äºæä½ç¬¦å¨SQLä¸ä½¿ç¨èµ·æ¥å¾æ¹ä¾¿ï¼è½å¿«éè¾¾å°æ们æ³è¦çææï¼ä½æ¯è¿äºç®åå¨åºå±æ¯æä¹å®ç°çå¢ï¼
order byå¾å®¹ææ³å°æ§è¡åçï¼å¨ä¸ä¸ªreduceä¸å°ææè®°å½æå¼æåºå³å¯ãå æ¤order byå¨æ°æ®é大çæ åµä¸æ§è¡æ¶é´é常é¿ï¼å®¹æout of memoryï¼éç¹æ®ä¸å¡éæ±ä¸è¬ä¸ä½¿ç¨ãdistribute byä¹æ¯è¾ææ¾ï¼æ ¹æ®hashå¼å°distributeçå¼ååå°ä¸åçreduceãsort byæ¯å°å·çorder byï¼åªè´è´£å°æ¬reducerä¸çå¼æåºï¼è¾¾å°å±é¨æåºçææãsort byådistribute byé å使ç¨é£å³æ´ä½³ï¼äºè å¯ä»¥å并ç®å为cluster byãcountåæ´å ææ°ï¼å¨combineræreducerå¤æç¸åé®ç´¯å å¼å°±è½å¾å°ã
æ¯è¾å¤æçæ¯distinctãjoinãgroup byï¼æ¬æéç¹è®¨è®ºè¿ä¸ä¸ªç®åå¨MapReduceå¼æä¸ç大è´å®ç°åçãçé¨å¼æ§ï¼æç å¼çã
mapé¶æ®µï¼å°group byåçå段ç»åä½ä¸ºkeyï¼å¦ægroup byåå段é£ä¹keyå°±ä¸ä¸ªãå°group byä¹åè¦è¿è¡çèåæä½å段ä½ä¸ºå¼ï¼å¦è¦è¿è¡countï¼åvalueæ¯1ï¼å¦è¦sumå¦ä¸ä¸ªå段ï¼åvalueå°±æ¯è¯¥å段ã
shuffleé¶æ®µï¼æç §keyçä¸åååå°ä¸åçreducerã注ææ¤æ¶å¯è½å 为keyåå¸ä¸ååèåºç°æ°æ®å¾æçé®é¢ã
reduceé¶æ®µï¼å°ç¸åkeyçå¼ç´¯å æä½å ¶ä»éè¦çèåæä½ï¼å¾å°ç»æã
对group byçè¿ç¨è®²è§£çæ¯è¾æ¸ æ¥çæ¯è¿ç¯æç« /info-detail-.html å¾æ并èï¼å¾çå¨ã
å®ä¾å¦ä¸å¾ï¼å¯¹åºè¯å¥æ¯ select rank, isonline, count(*) from city group by rank, isonline;
å¦ægroup byåºç°æ°æ®å¾æï¼é¤å»æ¿æ¢key为éæºæ°ãæåæåºå¤§æ°é级keyå¼çéç¨è°ä¼æ¹æ³ï¼éç¨äºgroup byçç¹æ®æ¹æ³æ以ä¸å ç§ï¼
ï¼1ï¼set hive.map.aggr=trueï¼å³å¼å¯map端çcombinerï¼åå°ä¼ å°reducerçæ°æ®éï¼åæ¶é设置åæ°hive.groupby.mapaggr.checkinterval è§å®å¨ map 端è¿è¡èåæä½çæ¡ç®æ°ç®ã
ï¼2ï¼è®¾ç½®mapred.reduce.tasks为è¾å¤§æ°éï¼éä½æ¯ä¸ªreducerå¤ççæ°æ®éã
ï¼3ï¼set hive.groupby.skewindata=trueï¼è¯¥åæ°å¯èªå¨è¿è¡è´è½½åè¡¡ãçæçæ¥è¯¢è®¡åä¼æ两个 MR Jobã第ä¸ä¸ª MR Job ä¸ï¼Map çè¾åºç»æéåä¼éæºåå¸å°Reduce ä¸ï¼æ¯ä¸ª Reduce åé¨åèåæä½ï¼å¹¶è¾åºç»æï¼è¿æ ·å¤ççç»ææ¯ç¸åç Group By Keyæå¯è½è¢«ååå°ä¸åç Reduce ä¸ï¼ä»èè¾¾å°è´è½½åè¡¡çç®çï¼ç¬¬äºä¸ª MR Job åæ ¹æ®é¢å¤ççæ°æ®ç»ææç § Group ByKey åå¸å° Reduce ä¸ï¼è¿ä¸ªè¿ç¨å¯ä»¥ä¿è¯ç¸åç Group By Key 被åå¸å°åä¸ä¸ª Reduceä¸ï¼ï¼æåå®ææç»çèåæä½ã
Hiveä¸æ两ç§joinæ¹å¼ï¼map joinåcommon join
å¦æä¸æ¾å¼æå®map side joinï¼æè 没æè¾¾å°è§¦åèªå¨map joinçæ¡ä»¶ï¼é£ä¹ä¼è¿è¡reduce端çjoinï¼å³common joinï¼è¿ç§joinå å«mapãshuffleãreduceä¸ä¸ªæ¥éª¤ã
ï¼1ï¼Mapé¶æ®µ
读åæºè¡¨çæ°æ®ï¼Mapè¾åºæ¶å以Join onæ¡ä»¶ä¸çå为keyï¼å¦æJoinæå¤ä¸ªå ³èé®ï¼å以è¿äºå ³èé®çç»åä½ä¸ºkeyãMapè¾åºçvalue为joinä¹åæå ³å¿ç(selectæè whereä¸éè¦ç¨å°ç)åï¼åæ¶å¨valueä¸è¿ä¼å å«è¡¨çTagä¿¡æ¯ï¼ç¨äºæ ææ¤value对åºåªä¸ªè¡¨ãç¶åæç §keyè¿è¡æåºã
ï¼2ï¼Shuffleé¶æ®µ
æ ¹æ®keyçå¼è¿è¡hash,并å°key/valueæç §hashå¼æ¨éè³ä¸åçreduceä¸ï¼è¿æ ·ç¡®ä¿ä¸¤ä¸ªè¡¨ä¸ç¸åçkeyä½äºåä¸ä¸ªreduceä¸
ï¼3ï¼Reduceé¶æ®µ
æ ¹æ®keyçå¼å®æjoinæä½ï¼æé´éè¿Tagæ¥è¯å«ä¸å表ä¸çæ°æ®ã
以ä¸é¢çSQL为ä¾ï¼å¯ç¨ä¸å¾æ示è¿ç¨å¤§è´è¡¨è¾¾å ¶joinåçã
SELECT u.name, o.orderid FROM user u JOIN order o ON u.uid = o.uid;
å ³èå段æ¯uidï¼å æ¤ä»¥uid为mapé¶æ®µçè¾åºkeyï¼value为éåçå段nameåæ è®°æºè¡¨çtagãshuffleé¶æ®µå°ç¸åkeyçé®å¼å¯¹åå°ä¸èµ·ï¼reduceé¶æ®µå°ä¸åæºè¡¨ãåä¸keyå¼çè®°å½æ¼æ¥èµ·æ¥ï¼å¯è½åå¨ä¸å¯¹å¤çæ åµã
å¦ææå®ä½¿ç¨map joinçæ¹å¼ï¼æè joinçå ¶ä¸ä¸å¼ 表å°äºæ个ä½ç§¯ï¼é»è®¤MBï¼ï¼åä¼ä½¿ç¨map joinæ¥æ§è¡ãå ·ä½å°è¡¨æå¤å°ï¼ç±åæ° hive.mapjoin.smalltable.filesize æ¥å³å®ã
Hive0.7ä¹åï¼éè¦ä½¿ç¨hintæ示 /*+ mapjoin(table) */æä¼æ§è¡MapJoin,å¦åæ§è¡Common Joinï¼ä½å¨0.7çæ¬ä¹åï¼é»è®¤èªå¨ä¼è½¬æ¢Map Joinï¼ç±åæ° hive.auto.convert.join æ¥æ§å¶ï¼é»è®¤ä¸ºtrueã
以ä¸å¾ä¸ºä¾è¯´æmap joinå¦ä½æ§è¡ï¼è¯¥å¾æ¥èª /archives///.htm ï¼å主æ¯ä¸ä¸ªæ°´å¹³æ·±ååä¹äºå享çåè¾ï¼å¾çæ°´å°ä¸ä¹æå ¶ç½åã
yarnä¼å¯å¨ä¸ä¸ªLocal Taskï¼å¨å®¢æ·ç«¯æ¬å°æ§è¡çTaskï¼--Task Aï¼è´è´£æ«æå°è¡¨bçæ°æ®ï¼å°å ¶è½¬æ¢æä¸ä¸ªHashTableçæ°æ®ç»æï¼å¹¶åå ¥æ¬å°çæ件ä¸ï¼ä¹åå°è¯¥æ件å è½½å°DistributeCacheä¸ã
æ¥ä¸æ¥æ¯Task Bï¼è¯¥ä»»å¡æ¯ä¸ä¸ªæ²¡æReduceçMRï¼å¯å¨MapTasksæ«æ大表a,å¨Mapé¶æ®µï¼æ ¹æ®açæ¯ä¸æ¡è®°å½å»åDistributeCacheä¸b表对åºçHashTableå ³èï¼å¹¶ç´æ¥è¾åºç»æã
ç±äºMapJoin没æReduceï¼æ以ç±Mapç´æ¥è¾åºç»ææ件ï¼æå¤å°ä¸ªMap Taskï¼å°±æå¤å°ä¸ªç»ææ件ã
distinctä¸è¬ågroup byåæ¶åºç°ã
å½distinctä¸ä¸ªå段æ¶ï¼å°group byçå段ådistinctçå段ç»åå¨ä¸èµ·ä½ä¸ºmapè¾åºçkeyï¼value设置为1ï¼åæ¶å°group byçå段å®ä¸ºååºé®ï¼è¿å¯ä»¥ç¡®ä¿ç¸ågroup byå段çè®°å½é½åå°åä¸ä¸ªreducerï¼å¹¶ä¸mapçè¾å ¥å¤©ç¶å°±æ¯æç §ç»åkeyæ好åºçãæ ¹æ®ååºé®å°è®°å½ååå°reduce端åï¼æ顺åºååºç»åé®ä¸çdistinctå段ï¼è¿æ¶distinctå段ä¹æ¯æ好åºçãä¾æ¬¡éådistinctå段ï¼æ¯æ¾å°ä¸ä¸ªä¸åå¼ï¼è®¡æ°å¨å°±èªå¢1ï¼å³å¯å¾å°count distinctç»æãä¾å¦ä¸é¢çSQLè¯å¥ï¼è¿ç¨å¯ä»¥ä¸å¾ç¤ºæã
æææ¶æ²¡æç解è¿æ¯æä¹å®ç°çï¼å«äººåçä¹æ²¡æçæç½ãæåè¯çå¦å¯äºè½¦ç大佬æç¹ä¸ä¸åï¼