Hive – Group By 的实现 explain分析

2019年12月05日 阅读数:447
这篇文章主要向大家介绍Hive – Group By 的实现 explain分析,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。


准备数据

[java]  view plain  copy
  1. SELECT uid, SUM(COUNT) FROM logs GROUP BY uid;  

[java]  view plain  copy
  1. hive> SELECT * FROM logs;  
  2. a   苹果  5  
  3. a   橙子  3  
  4. a      苹果   2  
  5. b   烧鸡  1  
  6.    
  7. hive> SELECT uid, SUM(COUNT) FROM logs GROUP BY uid;  
  8. a   10  
  9. b   1  


计算过程

hive-groupby-cal
默认设置了hive.map.aggr=true,因此会在mapper端先group by一次,最后再把结果merge起来,为了减小reducer处理的数据量。注意看explain的mode是不同的。mapper是hash,reducer是mergepartial。若是把hive.map.aggr=false,那将groupby放到reducer才作,他的mode是complete.java

Operator

hive-groupby-op

Explain

[java]  view plain  copy
  1. hive> explain SELECT uid, sum(count) FROM logs group by uid;  
  2. OK  
  3. ABSTRACT SYNTAX TREE:  
  4.   (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME logs))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL uid)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL count)))) (TOK_GROUPBY (TOK_TABLE_OR_COL uid))))  
  5.    
  6. STAGE DEPENDENCIES:  
  7.   Stage-1 is a root stage  
  8.   Stage-0 is a root stage  
  9.    
  10. STAGE PLANS:  
  11.   Stage: Stage-1  
  12.     Map Reduce  
  13.       Alias -> Map Operator Tree:  
  14.         logs   
  15.           TableScan // 扫描表  
  16.             alias: logs  
  17.             Select Operator //选择字段  
  18.               expressions:  
  19.                     expr: uid  
  20.                     type: string  
  21.                     expr: count  
  22.                     type: int  
  23.               outputColumnNames: uid, count  
  24.               Group By Operator //这里是由于默认设置了hive.map.aggr=true,会在mapper先作一次聚合,减小reduce须要处理的数据  
  25.                 aggregations:  
  26.                       expr: sum(count) //汇集函数  
  27.                 bucketGroup: false  
  28.                 keys: //键  
  29.                       expr: uid  
  30.                       type: string  
  31.                 mode: hash //hash方式,processHashAggr()  
  32.                 outputColumnNames: _col0, _col1  
  33.                 Reduce Output Operator //输出key,value给reducer  
  34.                   key expressions:  
  35.                         expr: _col0  
  36.                         type: string  
  37.                   sort order: +  
  38.                   Map-reduce partition columns:  
  39.                         expr: _col0  
  40.                         type: string  
  41.                   tag: -1  
  42.                   value expressions:  
  43.                         expr: _col1  
  44.                         type: bigint  
  45.       Reduce Operator Tree:  
  46.         Group By Operator  
  47.    
  48.           aggregations:  
  49.                 expr: sum(VALUE._col0)  
  50. //聚合  
  51.           bucketGroup: false  
  52.           keys:  
  53.                 expr: KEY._col0  
  54.                 type: string  
  55.           mode: mergepartial //合并值  
  56.           outputColumnNames: _col0, _col1  
  57.           Select Operator //选择字段  
  58.             expressions:  
  59.                   expr: _col0  
  60.                   type: string  
  61.                   expr: _col1  
  62.                   type: bigint  
  63.             outputColumnNames: _col0, _col1  
  64.             File Output Operator //输出到文件  
  65.               compressed: false  
  66.               GlobalTableId: 0  
  67.               table:  
  68.                   input format: org.apache.hadoop.mapred.TextInputFormat  
  69.                   output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  70.    
  71.   Stage: Stage-0  
  72.     Fetch Operator  
  73.       limit: -1  
  74.   
  75. hive> select distinct value from src;   
  76. hive> select max(key) from src;   
  77.   
  78. 由于没有grouping keys,因此只有一个reducer。  
  79.   
  80.   
  81.   
  82.     
  83.   
  84.       2.2 若是有聚合函数或者groupby,作以下处理:   
  85.   
  86.             插入一个select operator,选取全部的字段,用于优化阶段ColumnPruner的优化   
  87.   
  88.             2.2.1  hive.map.aggr为true,默认是true,开启的,在map端作部分聚合   
  89.   
  90.                   2.2.1.1 hive.groupby.skewindata为false,默认是关闭的,groupby的数据没有倾斜。        
  91.   
  92.                   生成的operator是: GroupByOperator+ReduceSinkOperator+GroupByOperator。   
  93.   
  94.       GroupByOperator+ReduceSinkOperator用于在map端作操做,第一个GroupByOperator在map端先作部分聚合。第二个用于在reduce端作GroupBy操做   
  95.   
  96.                   2.2.1.2 hive.groupby.skewindata为true   
  97.   
  98.                   生成的operator是: GroupbyOperator+ReduceSinkOperator+GroupbyOperator+ReduceSinkOperator +GroupByOperator   
  99.   
  100.                GroupbyOperator+ReduceSinkOperator(第一个MapredTask的map阶段)   
  101.   
  102.                GroupbyOperator(第一个MapredTask的reduce阶段)   
  103.   
  104.                ReduceSinkOperator (第二个MapredTask的map阶段)   
  105.   
  106.                GroupByOperator(第二个MapredTask的reduce阶段)   
  107.   
  108.             2.2.2  hive.map.aggr为false   
  109.   
  110.                    2.2.2.1 hive.groupby.skewindata为true   
  111.   
  112.                     生成的operator是: ReduceSinkOperator+GroupbyOperator+ReduceSinkOperator +GroupByOperator                      
  113.   
  114.                ReduceSinkOperator(第一个MapredTask的map阶段)   
  115.   
  116.                GroupbyOperator(第一个MapredTask的reduce阶段)   
  117.   
  118.                ReduceSinkOperator (第二个MapredTask的map阶段)   
  119.   
  120.                GroupByOperator(第二个MapredTask的reduce阶段)   
  121.   
  122.                    2.2.2.2 hive.groupby.skewindata为false   
  123.   
  124.                     生成的operator是: ReduceSinkOperator(map阶段运行)+GroupbyOperator(reduce阶段运行)   
  125.   
  126.   
  127.   
  128.   
  129.   
  130.   
  131.   
  132. 第一种状况:  
  133.   
  134. set hive.map.aggr=false;  
  135.   
  136. set hive.groupby.skewindata=false;  
  137.   
  138. SemanticAnalyzer.genGroupByPlan1MR(){  
  139.   
  140.   (1)ReduceSinkOperator: It will put all Group By keys and the   
  141. distinct field (if any) in the map-reduce sort key, and all other fields  
  142.  in the map-reduce value.  
  143.   
  144.   (2)GroupbyOperator:GroupByDesc.Mode.COMPLETE,Reducer: iterate/merge (mode = COMPLETE)  
  145.   
  146. }  
  147.   
  148.   
  149.   
  150. 第二种状况:  
  151.   
  152. set hive.map.aggr=true;   
  153.   
  154. set hive.groupby.skewindata=false;   
  155.   
  156. SemanticAnalyzer.genGroupByPlanMapAggr1MR(){  
  157.   
  158.    (1)GroupByOperator:GroupByDesc.Mode.HASH,The agggregation   
  159. evaluation functions are as follows: Mapper: iterate/terminatePartial   
  160. (mode = HASH)  
  161.   
  162.    (2)ReduceSinkOperator:Partitioning Key: grouping key。Sorting Key:  
  163.  grouping key if no DISTINCT grouping + distinct key if DISTINCT  
  164.   
  165.    (3)GroupByOperator:GroupByDesc.Mode.MERGEPARTIAL,Reducer:   
  166. iterate/terminate if DISTINCT merge/terminate if NO DISTINCT (mode =   
  167. MERGEPARTIAL)  
  168.   
  169. }  
  170.   
  171.   
  172.   
  173. 第三种状况:  
  174.   
  175. set hive.map.aggr=false;   
  176.   
  177. set hive.groupby.skewindata=true;   
  178.   
  179. SemanticAnalyzer.genGroupByPlan2MR(){  
  180.   
  181.     (1)ReduceSinkOperator:Partitioning Key: random() if no DISTINCT   
  182. grouping + distinct key if DISTINCT。Sorting Key: grouping key if no   
  183. DISTINCT grouping + distinct key if DISTINCT  
  184.   
  185.     (2)GroupbyOperator:GroupByDesc.Mode.PARTIAL1,Reducer: iterate/terminatePartial (mode = PARTIAL1)  
  186.   
  187.     (3)ReduceSinkOperator:Partitioning Key: grouping key。Sorting   
  188. Key: grouping key if no DISTINCT grouping + distinct key if DISTINCT  
  189.   
  190.     (4)GroupByOperator:GroupByDesc.Mode.FINAL,Reducer: merge/terminate (mode = FINAL)  
  191.   
  192. }  
  193.   
  194.   
  195.   
  196. 第四种状况:  
  197.   
  198. set hive.map.aggr=true;   
  199.   
  200. set hive.groupby.skewindata=true;   
  201.   
  202. SemanticAnalyzer.genGroupByPlanMapAggr2MR(){  
  203.   
  204.      (1)GroupbyOperator:GroupByDesc.Mode.HASH,Mapper: iterate/terminatePartial (mode = HASH)  
  205.   
  206.      (2)ReduceSinkOperator: Partitioning Key: random() if no   
  207. DISTINCT grouping + distinct key if DISTINCT。 Sorting Key: grouping key   
  208. if no DISTINCT grouping + distinct key if DISTINCT。  
  209.   
  210.      (3)GroupbyOperator:GroupByDesc.Mode.PARTIALS, Reducer:   
  211. iterate/terminatePartial if DISTINCT merge/terminatePartial if NO   
  212. DISTINCT (mode = MERGEPARTIAL)  
  213.   
  214.      (4)ReduceSinkOperator:Partitioining Key: grouping key。Sorting   
  215. Key: grouping key if no DISTINCT grouping + distinct key if DISTINCT  
  216.   
  217.      (5)GroupByOperator:GroupByDesc.Mode.FINAL,Reducer: merge/terminate (mode = FINAL)  
  218.   
  219. }  
  220.   
  221.   
  222.   
  223.   
  224.   
  225. ReduceSinkOperator的processOp(Object row, int   
  226. tag)会根据相应的条件设置Key的hash值,如第四种状况的第一个ReduceSinkOperator:Partitioning Key:   
  227. random() if no DISTINCT grouping + distinct key if   
  228. DISTINCT,若是没有DISTINCT字段,那么在OutputCollector.collect前会设置当前Key的hash值为一个随机  
  229. 数,random = new Random(12345);。若是有DISTINCT字段,那么key的hash值跟grouping +   
  230. distinct key有关。  
  231.   
  232.   
  233.   
  234.   
  235.   
  236.   
  237.   
  238. GroupByOperator:  
  239.   
  240. initializeOp(Configuration hconf)  
  241.   
  242. processOp(Object row, int tag)   
  243.   
  244. closeOp(boolean abort)  
  245.   
  246. forward(ArrayList<Object> keys, AggregationBuffer[] aggs)  
  247.   
  248.   
  249.   
  250.   
  251.   
  252. groupby10.q   groupby11.q  
  253.   
  254. set hive.map.aggr=false;  
  255.   
  256. set hive.groupby.skewindata=false;  
  257.   
  258.   
  259.   
  260. EXPLAIN  
  261.   
  262. FROM INPUT   
  263.   
  264. INSERT OVERWRITE TABLE dest1 SELECT INPUT.key,   
  265. count(substr(INPUT.value,5)), count(distinct substr(INPUT.value,5))   
  266. GROUP BY INPUT.key;  
  267.   
  268.   
  269.   
  270. STAGE DEPENDENCIES:  
  271.   
  272.   Stage-1 is a root stage  
  273.   
  274.   Stage-0 depends on stages: Stage-1  
  275.   
  276.   
  277.   
  278. STAGE PLANS:  
  279.   
  280.   Stage: Stage-1  
  281.   
  282.     Map Reduce  
  283.   
  284.       Alias -> Map Operator Tree:  
  285.   
  286.         input   
  287.   
  288.           TableScan  
  289.   
  290.             alias: input  
  291.   
  292.             Select Operator  // insertSelectAllPlanForGroupBy   
  293.   
  294.               expressions:  
  295.   
  296.                     expr: key  
  297.   
  298.                     type: int  
  299.   
  300.                     expr: value  
  301.   
  302.                     type: string  
  303.   
  304.               outputColumnNames: key, value  
  305.   
  306.               Reduce Output Operator  
  307.   
  308.                 key expressions:  
  309.   
  310.                       expr: key  
  311.   
  312.                       type: int  
  313.   
  314.                       expr: substr(value, 5)  
  315.   
  316.                       type: string  
  317.   
  318.                 sort order: ++  
  319.   
  320.                 Map-reduce partition columns:  
  321.   
  322.                       expr: key  
  323.   
  324.                       type: int  
  325.   
  326.                 tag: -1  
  327.   
  328.       Reduce Operator Tree:  
  329.   
  330.         Group By Operator  
  331.   
  332.           aggregations:  
  333.   
  334.                 expr: count(KEY._col1:0._col0)  
  335.   
  336.                 expr: count(DISTINCT KEY._col1:0._col0)  
  337.   
  338.           bucketGroup: false  
  339.   
  340.           keys:  
  341.   
  342.                 expr: KEY._col0  
  343.   
  344.                 type: int  
  345.   
  346.           mode: complete  
  347.   
  348.           outputColumnNames: _col0, _col1, _col2  
  349.   
  350.           Select Operator  
  351.   
  352.             expressions:  
  353.   
  354.                   expr: _col0  
  355.   
  356.                   type: int  
  357.   
  358.                   expr: _col1  
  359.   
  360.                   type: bigint  
  361.   
  362.                   expr: _col2  
  363.   
  364.                   type: bigint  
  365.   
  366.             outputColumnNames: _col0, _col1, _col2  
  367.   
  368.             Select Operator  
  369.   
  370.               expressions:  
  371.   
  372.                     expr: _col0  
  373.   
  374.                     type: int  
  375.   
  376.                     expr: UDFToInteger(_col1)  
  377.   
  378.                     type: int  
  379.   
  380.                     expr: UDFToInteger(_col2)  
  381.   
  382.                     type: int  
  383.   
  384.               outputColumnNames: _col0, _col1, _col2  
  385.   
  386.               File Output Operator  
  387.   
  388.                 compressed: false  
  389.   
  390.                 GlobalTableId: 1  
  391.   
  392.                 table:  
  393.   
  394.                     input format: org.apache.hadoop.mapred.TextInputFormat  
  395.   
  396.                     output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  397.   
  398.                     serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  399.   
  400.                     name: dest1  
  401.   
  402.   
  403.   
  404.   Stage: Stage-0  
  405.   
  406.     Move Operator  
  407.   
  408.       tables:  
  409.   
  410.           replace: true  
  411.   
  412.           table:  
  413.   
  414.               input format: org.apache.hadoop.mapred.TextInputFormat  
  415.   
  416.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  417.   
  418.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  419.   
  420.               name: dest1  
  421.   
  422.   
  423.   
  424.   
  425.   
  426.   
  427.   
  428.   
  429.   
  430. set hive.map.aggr=true;  
  431.   
  432. set hive.groupby.skewindata=false;  
  433.   
  434.   
  435.   
  436. STAGE DEPENDENCIES:  
  437.   
  438.   Stage-1 is a root stage  
  439.   
  440.   Stage-0 depends on stages: Stage-1  
  441.   
  442.   
  443.   
  444. STAGE PLANS:  
  445.   
  446.   Stage: Stage-1  
  447.   
  448.     Map Reduce  
  449.   
  450.       Alias -> Map Operator Tree:  
  451.   
  452.         input   
  453.   
  454.           TableScan  
  455.   
  456.             alias: input  
  457.   
  458.             Select Operator  
  459.   
  460.               expressions:  
  461.   
  462.                     expr: key  
  463.   
  464.                     type: int  
  465.   
  466.                     expr: value  
  467.   
  468.                     type: string  
  469.   
  470.               outputColumnNames: key, value  
  471.   
  472.               Group By Operator  
  473.   
  474.                 aggregations:  
  475.   
  476.                       expr: count(substr(value, 5))  
  477.   
  478.                       expr: count(DISTINCT substr(value, 5))  
  479.   
  480.                 bucketGroup: false  
  481.   
  482.                 keys:  
  483.   
  484.                       expr: key  
  485.   
  486.                       type: int  
  487.   
  488.                       expr: substr(value, 5)  
  489.   
  490.                       type: string  
  491.   
  492.                 mode: hash  
  493.   
  494.                 outputColumnNames: _col0, _col1, _col2, _col3  
  495.   
  496.                 Reduce Output Operator  
  497.   
  498.                   key expressions:  
  499.   
  500.                         expr: _col0  
  501.   
  502.                         type: int  
  503.   
  504.                         expr: _col1  
  505.   
  506.                         type: string  
  507.   
  508.                   sort order: ++  
  509.   
  510.                   Map-reduce partition columns:  
  511.   
  512.                         expr: _col0  
  513.   
  514.                         type: int  
  515.   
  516.                   tag: -1  
  517.   
  518.                   value expressions:  
  519.   
  520.                         expr: _col2  
  521.   
  522.                         type: bigint  
  523.   
  524.                         expr: _col3  
  525.   
  526.                         type: bigint  
  527.   
  528.       Reduce Operator Tree:  
  529.   
  530.         Group By Operator  
  531.   
  532.           aggregations:  
  533.   
  534.                 expr: count(VALUE._col0)  
  535.   
  536.                 expr: count(DISTINCT KEY._col1:0._col0)  
  537.   
  538.           bucketGroup: false  
  539.   
  540.           keys:  
  541.   
  542.                 expr: KEY._col0  
  543.   
  544.                 type: int  
  545.   
  546.           mode: mergepartial  
  547.   
  548.           outputColumnNames: _col0, _col1, _col2  
  549.   
  550.           Select Operator  
  551.   
  552.             expressions:  
  553.   
  554.                   expr: _col0  
  555.   
  556.                   type: int  
  557.   
  558.                   expr: _col1  
  559.   
  560.                   type: bigint  
  561.   
  562.                   expr: _col2  
  563.   
  564.                   type: bigint  
  565.   
  566.             outputColumnNames: _col0, _col1, _col2  
  567.   
  568.             Select Operator  
  569.   
  570.               expressions:  
  571.   
  572.                     expr: _col0  
  573.   
  574.                     type: int  
  575.   
  576.                     expr: UDFToInteger(_col1)  
  577.   
  578.                     type: int  
  579.   
  580.                     expr: UDFToInteger(_col2)  
  581.   
  582.                     type: int  
  583.   
  584.               outputColumnNames: _col0, _col1, _col2  
  585.   
  586.               File Output Operator  
  587.   
  588.                 compressed: false  
  589.   
  590.                 GlobalTableId: 1  
  591.   
  592.                 table:  
  593.   
  594.                     input format: org.apache.hadoop.mapred.TextInputFormat  
  595.   
  596.                     output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  597.   
  598.                     serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  599.   
  600.                     name: dest1  
  601.   
  602.   
  603.   
  604.   Stage: Stage-0  
  605.   
  606.     Move Operator  
  607.   
  608.       tables:  
  609.   
  610.           replace: true  
  611.   
  612.           table:  
  613.   
  614.               input format: org.apache.hadoop.mapred.TextInputFormat  
  615.   
  616.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  617.   
  618.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  619.   
  620.               name: dest1  
  621.   
  622.   
  623.   
  624.   
  625.   
  626.   
  627.   
  628.   
  629.   
  630.   
  631.   
  632.   
  633.   
  634.   
  635.   
  636.   
  637.   
  638. set hive.map.aggr=false;  
  639.   
  640. set hive.groupby.skewindata=true;  
  641.   
  642.   
  643.   
  644. STAGE DEPENDENCIES:  
  645.   
  646.   Stage-1 is a root stage  
  647.   
  648.   Stage-2 depends on stages: Stage-1  
  649.   
  650.   Stage-0 depends on stages: Stage-2  
  651.   
  652.   
  653.   
  654. STAGE PLANS:  
  655.   
  656.   Stage: Stage-1  
  657.   
  658.     Map Reduce  
  659.   
  660.       Alias -> Map Operator Tree:  
  661.   
  662.         input   
  663.   
  664.           TableScan  
  665.   
  666.             alias: input  
  667.   
  668.             Select Operator  
  669.   
  670.               expressions:  
  671.   
  672.                     expr: key  
  673.   
  674.                     type: int  
  675.   
  676.                     expr: value  
  677.   
  678.                     type: string  
  679.   
  680.               outputColumnNames: key, value  
  681.   
  682.               Reduce Output Operator  
  683.   
  684.                 key expressions:  
  685.   
  686.                       expr: key  
  687.   
  688.                       type: int  
  689.   
  690.                       expr: substr(value, 5)  
  691.   
  692.                       type: string  
  693.   
  694.                 sort order: ++  
  695.   
  696.                 Map-reduce partition columns:  
  697.   
  698.                       expr: key  
  699.   
  700.                       type: int  
  701.   
  702.                 tag: -1  
  703.   
  704.       Reduce Operator Tree:  
  705.   
  706.         Group By Operator  
  707.   
  708.           aggregations:  
  709.   
  710.                 expr: count(KEY._col1:0._col0)  
  711.   
  712.                 expr: count(DISTINCT KEY._col1:0._col0)  
  713.   
  714.           bucketGroup: false  
  715.   
  716.           keys:  
  717.   
  718.                 expr: KEY._col0  
  719.   
  720.                 type: int  
  721.   
  722.           mode: partial1  
  723.   
  724.           outputColumnNames: _col0, _col1, _col2  
  725.   
  726.           File Output Operator  
  727.   
  728.             compressed: false  
  729.   
  730.             GlobalTableId: 0  
  731.   
  732.             table:  
  733.   
  734.                 input format: org.apache.hadoop.mapred.SequenceFileInputFormat  
  735.   
  736.                 output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat  
  737.   
  738.   
  739.   
  740.   Stage: Stage-2  
  741.   
  742.     Map Reduce  
  743.   
  744.       Alias -> Map Operator Tree:  
  745.   
  746.         hdfs://localhost:54310/tmp/hive-tianzhao/hive_2011-07-15_21-48-26_387_7978992474997402829/-mr-10002   
  747.   
  748.             Reduce Output Operator  
  749.   
  750.               key expressions:  
  751.   
  752.                     expr: _col0  
  753.   
  754.                     type: int  
  755.   
  756.               sort order: +  
  757.   
  758.               Map-reduce partition columns:  
  759.   
  760.                     expr: _col0  
  761.   
  762.                     type: int  
  763.   
  764.               tag: -1  
  765.   
  766.               value expressions:  
  767.   
  768.                     expr: _col1  
  769.   
  770.                     type: bigint  
  771.   
  772.                     expr: _col2  
  773.   
  774.                     type: bigint  
  775.   
  776.       Reduce Operator Tree:  
  777.   
  778.         Group By Operator  
  779.   
  780.           aggregations:  
  781.   
  782.                 expr: count(VALUE._col0)  
  783.   
  784.                 expr: count(VALUE._col1)  
  785.   
  786.           bucketGroup: false  
  787.   
  788.           keys:  
  789.   
  790.                 expr: KEY._col0  
  791.   
  792.                 type: int  
  793.   
  794.           mode: final  
  795.   
  796.           outputColumnNames: _col0, _col1, _col2  
  797.   
  798.           Select Operator  
  799.   
  800.             expressions:  
  801.   
  802.                   expr: _col0  
  803.   
  804.                   type: int  
  805.   
  806.                   expr: _col1  
  807.   
  808.                   type: bigint  
  809.   
  810.                   expr: _col2  
  811.   
  812.                   type: bigint  
  813.   
  814.             outputColumnNames: _col0, _col1, _col2  
  815.   
  816.             Select Operator  
  817.   
  818.               expressions:  
  819.   
  820.                     expr: _col0  
  821.   
  822.                     type: int  
  823.   
  824.                     expr: UDFToInteger(_col1)  
  825.   
  826.                     type: int  
  827.   
  828.                     expr: UDFToInteger(_col2)  
  829.   
  830.                     type: int  
  831.   
  832.               outputColumnNames: _col0, _col1, _col2  
  833.   
  834.               File Output Operator  
  835.   
  836.                 compressed: false  
  837.   
  838.                 GlobalTableId: 1  
  839.   
  840.                 table:  
  841.   
  842.                     input format: org.apache.hadoop.mapred.TextInputFormat  
  843.   
  844.                     output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  845.   
  846.                     serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  847.   
  848.                     name: dest1  
  849.   
  850.   
  851.   
  852.   Stage: Stage-0  
  853.   
  854.     Move Operator  
  855.   
  856.       tables:  
  857.   
  858.           replace: true  
  859.   
  860.           table:  
  861.   
  862.               input format: org.apache.hadoop.mapred.TextInputFormat  
  863.   
  864.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  865.   
  866.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  867.   
  868.               name: dest1  
  869.   
  870.   
  871.   
  872.   
  873.   
  874.   
  875.   
  876.   
  877.   
  878. set hive.map.aggr=true;  
  879.   
  880. set hive.groupby.skewindata=true;  
  881.   
  882.   
  883.   
  884. STAGE DEPENDENCIES:  
  885.   
  886.   Stage-1 is a root stage  
  887.   
  888.   Stage-2 depends on stages: Stage-1  
  889.   
  890.   Stage-0 depends on stages: Stage-2  
  891.   
  892.   
  893.   
  894. STAGE PLANS:  
  895.   
  896.   Stage: Stage-1  
  897.   
  898.     Map Reduce  
  899.   
  900.       Alias -> Map Operator Tree:  
  901.   
  902.         input   
  903.   
  904.           TableScan  
  905.   
  906.             alias: input  
  907.   
  908.             Select Operator  
  909.   
  910.               expressions:  
  911.   
  912.                     expr: key  
  913.   
  914.                     type: int  
  915.   
  916.                     expr: value  
  917.   
  918.                     type: string  
  919.   
  920.               outputColumnNames: key, value  
  921.   
  922.               Group By Operator  
  923.   
  924.                 aggregations:  
  925.   
  926.                       expr: count(substr(value, 5))  
  927.   
  928.                       expr: count(DISTINCT substr(value, 5))  
  929.   
  930.                 bucketGroup: false  
  931.   
  932.                 keys:  
  933.   
  934.                       expr: key  
  935.   
  936.                       type: int  
  937.   
  938.                       expr: substr(value, 5)  
  939.   
  940.                       type: string  
  941.   
  942.                 mode: hash  
  943.   
  944.                 outputColumnNames: _col0, _col1, _col2, _col3  
  945.   
  946.                 Reduce Output Operator  
  947.   
  948.                   key expressions:  
  949.   
  950.                         expr: _col0  
  951.   
  952.                         type: int  
  953.   
  954.                         expr: _col1  
  955.   
  956.                         type: string  
  957.   
  958.                   sort order: ++  
  959.   
  960.                   Map-reduce partition columns:  
  961.   
  962.                         expr: _col0  
  963.   
  964.                         type: int  
  965.   
  966.                   tag: -1  
  967.   
  968.                   value expressions:  
  969.   
  970.                         expr: _col2  
  971.   
  972.                         type: bigint  
  973.   
  974.                         expr: _col3  
  975.   
  976.                         type: bigint  
  977.   
  978.       Reduce Operator Tree:  
  979.   
  980.         Group By Operator  
  981.   
  982.           aggregations:  
  983.   
  984.                 expr: count(VALUE._col0)  
  985.   
  986.                 expr: count(DISTINCT KEY._col1:0._col0)  
  987.   
  988.           bucketGroup: false  
  989.   
  990.           keys:  
  991.   
  992.                 expr: KEY._col0  
  993.   
  994.                 type: int  
  995.   
  996.           mode: partials  
  997.   
  998.           outputColumnNames: _col0, _col1, _col2  
  999.   
  1000.           File Output Operator  
  1001.   
  1002.             compressed: false  
  1003.   
  1004.             GlobalTableId: 0  
  1005.   
  1006.             table:  
  1007.   
  1008.                 input format: org.apache.hadoop.mapred.SequenceFileInputFormat  
  1009.   
  1010.                 output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat  
  1011.   
  1012.   
  1013.   
  1014.   Stage: Stage-2  
  1015.   
  1016.     Map Reduce  
  1017.   
  1018.       Alias -> Map Operator Tree:  
  1019.   
  1020.         hdfs://localhost:54310/tmp/hive-tianzhao/hive_2011-07-15_21-49-25_899_4946067838822964610/-mr-10002   
  1021.   
  1022.             Reduce Output Operator  
  1023.   
  1024.               key expressions:  
  1025.   
  1026.                     expr: _col0  
  1027.   
  1028.                     type: int  
  1029.   
  1030.               sort order: +  
  1031.   
  1032.               Map-reduce partition columns:  
  1033.   
  1034.                     expr: _col0  
  1035.   
  1036.                     type: int  
  1037.   
  1038.               tag: -1  
  1039.   
  1040.               value expressions:  
  1041.   
  1042.                     expr: _col1  
  1043.   
  1044.                     type: bigint  
  1045.   
  1046.                     expr: _col2  
  1047.   
  1048.                     type: bigint  
  1049.   
  1050.       Reduce Operator Tree:  
  1051.   
  1052.         Group By Operator  
  1053.   
  1054.           aggregations:  
  1055.   
  1056.                 expr: count(VALUE._col0)  
  1057.   
  1058.                 expr: count(VALUE._col1)  
  1059.   
  1060.           bucketGroup: false  
  1061.   
  1062.           keys:  
  1063.   
  1064.                 expr: KEY._col0  
  1065.   
  1066.                 type: int  
  1067.   
  1068.           mode: final  
  1069.   
  1070.           outputColumnNames: _col0, _col1, _col2  
  1071.   
  1072.           Select Operator  
  1073.   
  1074.             expressions:  
  1075.   
  1076.                   expr: _col0  
  1077.   
  1078.                   type: int  
  1079.   
  1080.                   expr: _col1  
  1081.   
  1082.                   type: bigint  
  1083.   
  1084.                   expr: _col2  
  1085.   
  1086.                   type: bigint  
  1087.   
  1088.             outputColumnNames: _col0, _col1, _col2  
  1089.   
  1090.             Select Operator  
  1091.   
  1092.               expressions:  
  1093.   
  1094.                     expr: _col0  
  1095.   
  1096.                     type: int  
  1097.   
  1098.                     expr: UDFToInteger(_col1)  
  1099.   
  1100.                     type: int  
  1101.   
  1102.                     expr: UDFToInteger(_col2)  
  1103.   
  1104.                     type: int  
  1105.   
  1106.               outputColumnNames: _col0, _col1, _col2  
  1107.   
  1108.               File Output Operator  
  1109.   
  1110.                 compressed: false  
  1111.   
  1112.                 GlobalTableId: 1  
  1113.   
  1114.                 table:  
  1115.   
  1116.                     input format: org.apache.hadoop.mapred.TextInputFormat  
  1117.   
  1118.                     output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1119.   
  1120.                     serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1121.   
  1122.                     name: dest1  
  1123.   
  1124.   
  1125.   
  1126.   Stage: Stage-0  
  1127.   
  1128.     Move Operator  
  1129.   
  1130.       tables:  
  1131.   
  1132.           replace: true  
  1133.   
  1134.           table:  
  1135.   
  1136.               input format: org.apache.hadoop.mapred.TextInputFormat  
  1137.   
  1138.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1139.   
  1140.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1141.   
  1142.               name: dest1  
  1143.   
  1144.   
  1145.   
  1146.   
  1147.   
  1148.   
  1149.   
  1150.   
  1151.   
  1152.   
  1153.   
  1154.   
  1155.   
  1156.   
  1157.   
  1158.   
  1159.   
  1160. set hive.map.aggr=false;  
  1161.   
  1162. set hive.groupby.skewindata=false;  
  1163.   
  1164.   
  1165.   
  1166. EXPLAIN extended  
  1167.   
  1168. FROM INPUT   
  1169.   
  1170. INSERT OVERWRITE TABLE dest1 SELECT INPUT.key,   
  1171. count(substr(INPUT.value,5)), count(distinct substr(INPUT.value,5))   
  1172. GROUP BY INPUT.key;  
  1173.   
  1174.   
  1175.   
  1176. STAGE DEPENDENCIES:  
  1177.   
  1178.   Stage-1 is a root stage  
  1179.   
  1180.   Stage-0 depends on stages: Stage-1  
  1181.   
  1182.   
  1183.   
  1184. STAGE PLANS:  
  1185.   
  1186.   Stage: Stage-1  
  1187.   
  1188.     Map Reduce  
  1189.   
  1190.       Alias -> Map Operator Tree:  
  1191.   
  1192.         input   
  1193.   
  1194.           TableScan  
  1195.   
  1196.             alias: input  
  1197.   
  1198.             Select Operator  
  1199.   
  1200.               expressions:  
  1201.   
  1202.                     expr: key  
  1203.   
  1204.                     type: int  
  1205.   
  1206.                     expr: value  
  1207.   
  1208.                     type: string  
  1209.   
  1210.               outputColumnNames: key, value  
  1211.   
  1212.               Reduce Output Operator  
  1213.   
  1214.                 key expressions:  
  1215.   
  1216.                       expr: key  
  1217.   
  1218.                       type: int  
  1219.   
  1220.                       expr: substr(value, 5)  
  1221.   
  1222.                       type: string  
  1223.   
  1224.                 sort order: ++  
  1225.   
  1226.                 Map-reduce partition columns:  
  1227.   
  1228.                       expr: key  
  1229.   
  1230.                       type: int  
  1231.   
  1232.                 tag: -1  
  1233.   
  1234.       Needs Tagging: false  
  1235.   
  1236.       Path -> Alias:  
  1237.   
  1238.         hdfs://localhost:54310/user/hive/warehouse/input [input]  
  1239.   
  1240.       Path -> Partition:  
  1241.   
  1242.         hdfs://localhost:54310/user/hive/warehouse/input   
  1243.   
  1244.           Partition  
  1245.   
  1246.             base file name: input  
  1247.   
  1248.             input format: org.apache.hadoop.mapred.TextInputFormat  
  1249.   
  1250.             output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1251.   
  1252.             properties:  
  1253.   
  1254.               bucket_count -1  
  1255.   
  1256.               columns key,value  
  1257.   
  1258.               columns.types int:string  
  1259.   
  1260.               file.inputformat org.apache.hadoop.mapred.TextInputFormat  
  1261.   
  1262.               file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1263.   
  1264.               location hdfs://localhost:54310/user/hive/warehouse/input  
  1265.   
  1266.               name input  
  1267.   
  1268.               serialization.ddl struct input { i32 key, string value}  
  1269.   
  1270.               serialization.format 1  
  1271.   
  1272.               serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1273.   
  1274.               transient_lastDdlTime 1310523947  
  1275.   
  1276.             serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1277.   
  1278.             
  1279.   
  1280.               input format: org.apache.hadoop.mapred.TextInputFormat  
  1281.   
  1282.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1283.   
  1284.               properties:  
  1285.   
  1286.                 bucket_count -1  
  1287.   
  1288.                 columns key,value  
  1289.   
  1290.                 columns.types int:string  
  1291.   
  1292.                 file.inputformat org.apache.hadoop.mapred.TextInputFormat  
  1293.   
  1294.                 file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1295.   
  1296.                 location hdfs://localhost:54310/user/hive/warehouse/input  
  1297.   
  1298.                 name input  
  1299.   
  1300.                 serialization.ddl struct input { i32 key, string value}  
  1301.   
  1302.                 serialization.format 1  
  1303.   
  1304.                 serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1305.   
  1306.                 transient_lastDdlTime 1310523947  
  1307.   
  1308.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1309.   
  1310.               name: input  
  1311.   
  1312.             name: input  
  1313.   
  1314.       Reduce Operator Tree:  
  1315.   
  1316.         Group By Operator  
  1317.   
  1318.           aggregations:  
  1319.   
  1320.                 expr: count(KEY._col1:0._col0)  
  1321.   
  1322.                 expr: count(DISTINCT KEY._col1:0._col0)  
  1323.   
  1324.           bucketGroup: false  
  1325.   
  1326.           keys:  
  1327.   
  1328.                 expr: KEY._col0  
  1329.   
  1330.                 type: int  
  1331.   
  1332.           mode: complete  
  1333.   
  1334.           outputColumnNames: _col0, _col1, _col2  
  1335.   
  1336.           Select Operator  
  1337.   
  1338.             expressions:  
  1339.   
  1340.                   expr: _col0  
  1341.   
  1342.                   type: int  
  1343.   
  1344.                   expr: _col1  
  1345.   
  1346.                   type: bigint  
  1347.   
  1348.                   expr: _col2  
  1349.   
  1350.                   type: bigint  
  1351.   
  1352.             outputColumnNames: _col0, _col1, _col2  
  1353.   
  1354.             Select Operator  
  1355.   
  1356.               expressions:  
  1357.   
  1358.                     expr: _col0  
  1359.   
  1360.                     type: int  
  1361.   
  1362.                     expr: UDFToInteger(_col1)  
  1363.   
  1364.                     type: int  
  1365.   
  1366.                     expr: UDFToInteger(_col2)  
  1367.   
  1368.                     type: int  
  1369.   
  1370.               outputColumnNames: _col0, _col1, _col2  
  1371.   
  1372.               File Output Operator  
  1373.   
  1374.                 compressed: false  
  1375.   
  1376.                 GlobalTableId: 1  
  1377.   
  1378.                 directory: hdfs://localhost:54310/tmp/hive-tianzhao/hive_2011-07-15_21-50-38_510_6852880850328147221/-ext-10000  
  1379.   
  1380.                 NumFilesPerFileSink: 1  
  1381.   
  1382.                 table:  
  1383.   
  1384.                     input format: org.apache.hadoop.mapred.TextInputFormat  
  1385.   
  1386.                     output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1387.   
  1388.                     properties:  
  1389.   
  1390.                       bucket_count -1  
  1391.   
  1392.                       columns key,val1,val2  
  1393.   
  1394.                       columns.types int:int:int  
  1395.   
  1396.                       file.inputformat org.apache.hadoop.mapred.TextInputFormat  
  1397.   
  1398.                       file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1399.   
  1400.                       location hdfs://localhost:54310/user/hive/warehouse/dest1  
  1401.   
  1402.                       name dest1  
  1403.   
  1404.                       serialization.ddl struct dest1 { i32 key, i32 val1, i32 val2}  
  1405.   
  1406.                       serialization.format 1  
  1407.   
  1408.                       serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1409.   
  1410.                       transient_lastDdlTime 1310523946  
  1411.   
  1412.                     serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1413.   
  1414.                     name: dest1  
  1415.   
  1416.                 TotalFiles: 1  
  1417.   
  1418.                 MultiFileSpray: false  
  1419.   
  1420.   
  1421.   
  1422.   Stage: Stage-0  
  1423.   
  1424.     Move Operator  
  1425.   
  1426.       tables:  
  1427.   
  1428.           replace: true  
  1429.   
  1430.           source: hdfs://localhost:54310/tmp/hive-tianzhao/hive_2011-07-15_21-50-38_510_6852880850328147221/-ext-10000  
  1431.   
  1432.           table:  
  1433.   
  1434.               input format: org.apache.hadoop.mapred.TextInputFormat  
  1435.   
  1436.               output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1437.   
  1438.               properties:  
  1439.   
  1440.                 bucket_count -1  
  1441.   
  1442.                 columns key,val1,val2  
  1443.   
  1444.                 columns.types int:int:int  
  1445.   
  1446.                 file.inputformat org.apache.hadoop.mapred.TextInputFormat  
  1447.   
  1448.                 file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
  1449.   
  1450.                 location hdfs://localhost:54310/user/hive/warehouse/dest1  
  1451.   
  1452.                 name dest1  
  1453.   
  1454.                 serialization.ddl struct dest1 { i32 key, i32 val1, i32 val2}  
  1455.   
  1456.                 serialization.format 1  
  1457.   
  1458.                 serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1459.   
  1460.                 transient_lastDdlTime 1310523946  
  1461.   
  1462.               serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
  1463.   
  1464.               name: dest1  
  1465.   
  1466.           tmp directory: hdfs://localhost:54310/tmp/hive-tianzhao/hive_2011-07-15_21-50-38_510_6852880850328147221/-ext-10001  
  1467.   
  1468.   
  1469.   
  1470.   
  1471.   
  1472.   
  1473.   
  1474. ABSTRACT SYNTAX TREE:  
  1475.   
  1476. (TOK_QUERY   
  1477.   
  1478.     (TOK_FROM (TOK_TABREF INPUT))   
  1479.   
  1480.     (TOK_INSERT   
  1481.   
  1482.         (TOK_DESTINATION (TOK_TAB dest1))   
  1483.   
  1484.         (TOK_SELECT   
  1485.   
  1486.             (TOK_SELEXPR (. (TOK_TABLE_OR_COL INPUT) key))   
  1487.   
  1488.             (TOK_SELEXPR (TOK_FUNCTION count (TOK_FUNCTION substr (. (TOK_TABLE_OR_COL INPUT) value) 5)))   
  1489.   
  1490.             (TOK_SELEXPR (TOK_FUNCTIONDI count (TOK_FUNCTION substr (. (TOK_TABLE_OR_COL INPUT) value) 5)))  
  1491.   
  1492.         )  
  1493.   
  1494.         (TOK_GROUPBY (. (TOK_TABLE_OR_COL INPUT) key))  
  1495.   
  1496.     )  
  1497.   
  1498. )  
  1499.   
  1500.   
  1501.   
  1502.   
  1503.   
  1504.   
  1505.   
  1506. SemanticAnalyzer.genBodyPlan(QB qb, Operator input){  
  1507.   
  1508.        if (qbp.getAggregationExprsForClause(dest).size() != 0  
  1509.   
  1510.             || getGroupByForClause(qbp, dest).size() > 0) { //若是有聚合函数或者有groupby,则执行下面的操做  
  1511.   
  1512.           //multiple distincts is not supported with skew in data  
  1513.   
  1514.           if (conf.getVar(HiveConf.ConfVars.HIVEGROUPBYSKEW)  
  1515.   
  1516.               .equalsIgnoreCase("true") &&  
  1517.   
  1518.              qbp.getDistinctFuncExprsForClause(dest).size() > 1) {  
  1519.   
  1520.             throw new SemanticException(ErrorMsg.UNSUPPORTED_MULTIPLE_DISTINCTS.  
  1521.   
  1522.                 getMsg());  
  1523.   
  1524.           }  
  1525.   
  1526.           // insert a select operator here used by the ColumnPruner to reduce  
  1527.   
  1528.           // the data to shuffle  
  1529.   
  1530.           curr = insertSelectAllPlanForGroupBy(dest, curr); //生成一个SelectOperator,全部的字段都会选取,selectStar=true。  
  1531.   
  1532.           if (conf.getVar(HiveConf.ConfVars.HIVEMAPSIDEAGGREGATE)  
  1533.   
  1534.               .equalsIgnoreCase("true")) {  
  1535.   
  1536.             if (conf.getVar(HiveConf.ConfVars.HIVEGROUPBYSKEW)  
  1537.   
  1538.                 .equalsIgnoreCase("false")) {  
  1539.   
  1540.               curr = genGroupByPlanMapAggr1MR(dest, qb, curr);  
  1541.   
  1542.             } else {  
  1543.   
  1544.               curr = genGroupByPlanMapAggr2MR(dest, qb, curr);  
  1545.   
  1546.             }  
  1547.   
  1548.           } else if (conf.getVar(HiveConf.ConfVars.HIVEGROUPBYSKEW)  
  1549.   
  1550.               .equalsIgnoreCase("true")) {  
  1551.   
  1552.             curr = genGroupByPlan2MR(dest, qb, curr);  
  1553.   
  1554.           } else {  
  1555.   
  1556.             curr = genGroupByPlan1MR(dest, qb, curr);  
  1557.   
  1558.           }  
  1559.   
  1560.        }     
  1561.   
  1562. }  
  1563.   
  1564.   
  1565.   
  1566. distince:  
  1567.   
  1568. count.q.out  
  1569.   
  1570. groupby11.q.out  
  1571.   
  1572. groupby10.q.out  
  1573.   
  1574. nullgroup4_multi_distinct.q.out  
  1575.   
  1576. join18.q.out  
  1577.   
  1578. groupby_bigdata.q.out  
  1579.   
  1580. join18_multi_distinct.q.out  
  1581.   
  1582. nullgroup4.q.out  
  1583.   
  1584. auto_join18_multi_distinct.q.out  
  1585.   
  1586. auto_join18.q.out  
  1587.   
  1588.   
  1589.   
  1590. 1)map端部分聚合,数据无倾斜,一个MR生成。  
  1591.   
  1592. genGroupByPlanMapAggr1MR,生成三个Operator:  
  1593.   
  1594. 1.1)GroupByOperator:map-side partial aggregation,由genGroupByPlanMapGroupByOperator方法生成:  
  1595.   
  1596.        处理groupby子句,getGroupByForClause,groupby的column加入groupByKeys和outputColumnNames  
  1597.   
  1598.        处理select中的Distinct,getDistinctFuncExprsForClause,Distinct的column,加入groupByKeys和outputColumnNames  
  1599.   
  1600.        处理聚合函数,getAggregationExprsForClause,生成AggregationDesc加入aggregations,生成column加入outputColumnNames  
  1601.   
  1602.   public GroupByDesc(  
  1603.   
  1604.       final Mode mode,  
  1605.   
  1606.       final java.util.ArrayList<java.lang.String> outputColumnNames,  
  1607.   
  1608.       final java.util.ArrayList<ExprNodeDesc> keys,  
  1609.   
  1610.       final java.util.ArrayList<org.apache.hadoop.hive.ql.plan.AggregationDesc> aggregators,  
  1611.   
  1612.       final boolean groupKeyNotReductionKey,float groupByMemoryUsage, float memoryThreshold) {  
  1613.   
  1614.     this(mode, outputColumnNames, keys, aggregators, groupKeyNotReductionKey,  
  1615.   
  1616.         false, groupByMemoryUsage, memoryThreshold);  
  1617.   
  1618.   }  
  1619.   
  1620.   mode:GroupByDesc.Mode.HASH  
  1621.   
  1622.   outputColumnNames:groupby+Distinct+Aggregation  
  1623.   
  1624.   keys:groupby+Distinct  
  1625.   
  1626.   aggregators:Aggregation  
  1627.   
  1628.   groupKeyNotReductionKey:false  
  1629.   
  1630.   groupByMemoryUsage:默认为0.5  
  1631.   
  1632.   memoryThreshold:默认为0.9    
  1633.   
  1634.   
  1635.   
  1636. 1.2)ReduceSinkOperator  
  1637.   
  1638.       处理groupby子句,getGroupByForClause,groupby的column加入reduceKeys和outputKeyColumnNames  
  1639.   
  1640.       处理select中的Distinct,getDistinctFuncExprsForClause,Distinct的column,加入reduceKeys和outputKeyColumnNames  
  1641.   
  1642.       处理聚合函数,getAggregationExprsForClause,须要作聚合的column加入reduceValues和outputValueColumnNames  
  1643.   
  1644.  public ReduceSinkDesc(java.util.ArrayList<ExprNodeDesc> keyCols,  
  1645.   
  1646.       int numDistributionKeys,  
  1647.   
  1648.       java.util.ArrayList<ExprNodeDesc> valueCols,  
  1649.   
  1650.       java.util.ArrayList<java.lang.String> outputKeyColumnNames,  
  1651.   
  1652.       List<List<Integer>> distinctColumnIndices,  
  1653.   
  1654.       java.util.ArrayList<java.lang.String> outputValueColumnNames, int tag,  
  1655.   
  1656.       java.util.ArrayList<ExprNodeDesc> partitionCols, int numReducers,  
  1657.   
  1658.       final TableDesc keySerializeInfo, final TableDesc valueSerializeInfo) {  
  1659.   
  1660.     this.keyCols = keyCols; // 为reduceKeys,groupby+distinct  
  1661.   
  1662.     this.numDistributionKeys = numDistributionKeys; // grpByExprs.size()  
  1663.   
  1664.     this.valueCols = valueCols; //reduceValues,聚合函数  
  1665.   
  1666.     this.outputKeyColumnNames = outputKeyColumnNames; //outputKeyColumnNames  
  1667.   
  1668.     this.outputValueColumnNames = outputValueColumnNames; //outputValueColumnNames  
  1669.   
  1670.     this.tag = tag; // -1  
  1671.   
  1672.     this.numReducers = numReducers; // 通常都是-1  
  1673.   
  1674.     this.partitionCols = partitionCols; // groupby  
  1675.   
  1676.     this.keySerializeInfo = keySerializeInfo;  
  1677.   
  1678.     this.valueSerializeInfo = valueSerializeInfo;  
  1679.   
  1680.     this.distinctColumnIndices = distinctColumnIndices;  
  1681.   
  1682.   }  
  1683.   
  1684.   
  1685.   
  1686. 1.3)GroupByOperator  
  1687.   
  1688.       处理groupby子句,getGroupByForClause,groupby的column加入reduceKeys和outputKeyColumnNames  
  1689.   
  1690.       处理聚合函数,getAggregationExprsForClause,须要作聚合的column加入reduceValues和outputValueColumnNames  
  1691.   
  1692.   public GroupByDesc(  
  1693.   
  1694.       final Mode mode,  
  1695.   
  1696.       final java.util.ArrayList<java.lang.String> outputColumnNames,  
  1697.   
  1698.       final java.util.ArrayList<ExprNodeDesc> keys,  
  1699.   
  1700.       final java.util.ArrayList<org.apache.hadoop.hive.ql.plan.AggregationDesc> aggregators,  
  1701.   
  1702.       final boolean groupKeyNotReductionKey,float groupByMemoryUsage, float memoryThreshold) {  
  1703.   
  1704.     this(mode, outputColumnNames, keys, aggregators, groupKeyNotReductionKey,  
  1705.   
  1706.         false, groupByMemoryUsage, memoryThreshold);  
  1707.   
  1708.   }  
  1709.   
  1710.   mode:GroupByDesc.Mode.MERGEPARTIAL  
  1711.   
  1712.   outputColumnNames:groupby+Aggregation  
  1713.   
  1714.   keys:groupby  
  1715.   
  1716.   aggregators:Aggregation  
  1717.   
  1718.   groupKeyNotReductionKey:false  
  1719.   
  1720.   groupByMemoryUsage:默认为0.5  
  1721.   
  1722.   memoryThreshold:默认为0.9    
  1723.   
  1724.   
  1725.   
  1726. 2)map端部分聚合,数据倾斜,两个MR生成。  
  1727.   
  1728. genGroupByPlanMapAggr2MR:  
  1729.   
  1730. 2.1)GroupByOperator:map-side partial aggregation,由genGroupByPlanMapGroupByOperator方法生成:  
  1731.   
  1732.        处理groupby子句,getGroupByForClause,groupby的column加入groupByKeys和outputColumnNames  
  1733.   
  1734.        处理select中的Distinct,getDistinctFuncExprsForClause,Distinct的column,加入groupByKeys和outputColumnNames  
  1735.   
  1736.        处理聚合函数,getAggregationExprsForClause,生成AggregationDesc加入aggregations,生成column加入outputColumnNames  
  1737.   
  1738.   public GroupByDesc(  
  1739.   
  1740.       final Mode mode,  
  1741.   
  1742.       final java.util.ArrayList<java.lang.String> outputColumnNames,  
  1743.   
  1744.       final java.util.ArrayList<ExprNodeDesc> keys,  
  1745.   
  1746.       final java.util.ArrayList<org.apache.hadoop.hive.ql.plan.AggregationDesc> aggregators,  
  1747.   
  1748.       final boolean groupKeyNotReductionKey,float groupByMemoryUsage, float memoryThreshold) {  
  1749.   
  1750.     this(mode, outputColumnNames, keys, aggregators, groupKeyNotReductionKey,  
  1751.   
  1752.         false, groupByMemoryUsage, memoryThreshold);  
  1753.   
  1754.   }  
  1755.   
  1756.   mode:GroupByDesc.Mode.HASH  
  1757.   
  1758.   outputColumnNames:groupby+Distinct+Aggregation  
  1759.   
  1760.   keys:groupby+Distinct  
  1761.   
  1762.   aggregators:Aggregation  
  1763.   
  1764.   groupKeyNotReductionKey:false  
  1765.   
  1766.   groupByMemoryUsage:默认为0.5  
  1767.   
  1768.   memoryThreshold:默认为0.9    
  1769.   
  1770.   
  1771.   
  1772. 2.2)ReduceSinkOperator  
  1773.   
  1774.       处理groupby子句,getGroupByForClause,groupby的column加入reduceKeys和outputKeyColumnNames  
  1775.   
  1776.       处理select中的Distinct,getDistinctFuncExprsForClause,Distinct的column,加入reduceKeys和outputKeyColumnNames  
  1777.   
  1778.       处理聚合函数,getAggregationExprsForClause,须要作聚合的column加入reduceValues和outputValueColumnNames  
  1779.   
  1780.  public ReduceSinkDesc(java.util.ArrayList<ExprNodeDesc> keyCols,  
  1781.   
  1782.       int numDistributionKeys,  
  1783.   
  1784.       java.util.ArrayList<ExprNodeDesc> valueCols,  
  1785.   
  1786.       java.util.ArrayList<java.lang.String> outputKeyColumnNames,  
  1787.   
  1788.       List<List<Integer>> distinctColumnIndices,  
  1789.   
  1790.       java.util.ArrayList<java.lang.String> outputValueColumnNames, int tag,  
  1791.   
  1792.       java.util.ArrayList<ExprNodeDesc> partitionCols, int numReducers,  
  1793.   
  1794.       final TableDesc keySerializeInfo, final TableDesc valueSerializeInfo) {  
  1795.   
  1796.     this.keyCols = keyCols; // 为reduceKeys,groupby+distinct  
  1797.   
  1798.     this.numDistributionKeys = numDistributionKeys; // grpByExprs.size()  
  1799.   
  1800.     this.valueCols = valueCols; //reduceValues,聚合函数  
  1801.   
  1802.     this.outputKeyColumnNames = outputKeyColumnNames; //outputKeyColumnNames  
  1803.   
  1804.     this.outputValueColumnNames = outputValueColumnNames; //outputValueColumnNames  
  1805.   
  1806.     this.tag = tag; // -1  
  1807.   
  1808.     this.numReducers = numReducers; // 通常都是-1  
  1809.   
  1810.     this.partitionCols = partitionCols; // groupby  
  1811.   
  1812.     this.keySerializeInfo = keySerializeInfo;  
  1813.   
  1814.     this.valueSerializeInfo = valueSerializeInfo;  
  1815.   
  1816.     this.distinctColumnIndices = distinctColumnIndices;  
  1817.   
  1818.   }  
  1819.   
  1820.   
  1821.   
  1822. 2.3)GroupByOperator  
  1823.   
  1824.       处理groupby子句,getGroupByForClause,groupby的column加入groupByKeys和outputColumnNames  
  1825.   
  1826.       处理聚合函数,getAggregationExprsForClause,生成AggregationDesc加入aggregations,生成column加入outputColumnNames  
  1827.   
  1828.   public GroupByDesc(  
  1829.   
  1830.       final Mode mode,  
  1831.   
  1832.       final java.util.ArrayList<java.lang.String> outputColumnNames,  
  1833.   
  1834.       final java.util.ArrayList<ExprNodeDesc> keys,  
  1835.   
  1836.       final java.util.ArrayList<org.apache.hadoop.hive.ql.plan.AggregationDesc> aggregators,  
  1837.   
  1838.       final boolean groupKeyNotReductionKey,float groupByMemoryUsage, float memoryThreshold) {  
  1839.   
  1840.     this(mode, outputColumnNames, keys, aggregators, groupKeyNotReductionKey,  
  1841.   
  1842.         false, groupByMemoryUsage, memoryThreshold);  
  1843.   
  1844.   }  
  1845.   
  1846.   mode:GroupByDesc.Mode.PARTIALS  
  1847.   
  1848.   outputColumnNames:groupby+Aggregation  
  1849.   
  1850.   keys:groupby  
  1851.   
  1852.   aggregators:Aggregation  
  1853.   
  1854.   groupKeyNotReductionKey:false  
  1855.   
  1856.   groupByMemoryUsage:默认为0.5  
  1857.   
  1858.   memoryThreshold:默认为0.9    
  1859.   
  1860.   
  1861.   
  1862. 2.4)ReduceSinkOperator  
  1863.   
  1864.       处理groupby子句,getGroupByForClause,groupby的column加入reduceKeys和outputColumnNames  
  1865.   
  1866.       处理聚合函数,getAggregationExprsForClause,须要作聚合的column加入reduceValues和outputColumnNames  
  1867.   
  1868.  public ReduceSinkDesc(java.util.ArrayList<ExprNodeDesc> keyCols,  
  1869.   
  1870.       int numDistributionKeys,  
  1871.   
  1872.       java.util.ArrayList<ExprNodeDesc> valueCols,  
  1873.   
  1874.       java.util.ArrayList<java.lang.String> outputKeyColumnNames,  
  1875.   
  1876.       List<List<Integer>> distinctColumnIndices,  
  1877.   
  1878.       java.util.ArrayList<java.lang.String> outputValueColumnNames, int tag,  
  1879.   
  1880.       java.util.ArrayList<ExprNodeDesc> partitionCols, int numReducers,  
  1881.   
  1882.       final TableDesc keySerializeInfo, final TableDesc valueSerializeInfo) {  
  1883.   
  1884.     this.keyCols = keyCols; // 为reduceKeys,groupby  
  1885.   
  1886.     this.numDistributionKeys = numDistributionKeys; // grpByExprs.size()  
  1887.   
  1888.     this.valueCols = valueCols; //reduceValues,聚合函数  
  1889.   
  1890.     this.outputKeyColumnNames = outputKeyColumnNames; //outputKeyColumnNames  
  1891.   
  1892.     this.outputValueColumnNames = outputValueColumnNames; //outputValueColumnNames  
  1893.   
  1894.     this.tag = tag; // -1  
  1895.   
  1896.     this.numReducers = numReducers; // 通常都是-1  
  1897.   
  1898.     this.partitionCols = partitionCols; // groupby  
  1899.   
  1900.     this.keySerializeInfo = keySerializeInfo;  
  1901.   
  1902.     this.valueSerializeInfo = valueSerializeInfo;  
  1903.   
  1904.     this.distinctColumnIndices = distinctColumnIndices;  
  1905.   
  1906.   }  
  1907.   
  1908.   
  1909.   
  1910. 2.5)GroupByOperator  
  1911.   
  1912.       处理groupby子句,getGroupByForClause,groupby的column加入groupByKeys和outputColumnNames  
  1913.   
  1914.       处理聚合函数,getAggregationExprsForClause,生成AggregationDesc加入aggregations,须要作聚合的column加入outputColumnNames  
  1915.   
  1916.   public GroupByDesc(  
  1917.   
  1918.       final Mode mode,  
  1919.   
  1920.       final java.util.ArrayList<java.lang.String> outputColumnNames,  
  1921.   
  1922.       final java.util.ArrayList<ExprNodeDesc> keys,  
  1923.   
  1924.       final java.util.ArrayList<org.apache.hadoop.hive.ql.plan.AggregationDesc> aggregators,  
  1925.   
  1926.       final boolean groupKeyNotReductionKey,float groupByMemoryUsage, float memoryThreshold) {  
  1927.   
  1928.     this(mode, outputColumnNames, keys, aggregators, groupKeyNotReductionKey,  
  1929.   
  1930.         false, groupByMemoryUsage, memoryThreshold);  
  1931.   
  1932.   }  
  1933.   
  1934.   mode:GroupByDesc.Mode.FINAL  
  1935.   
  1936.   outputColumnNames:groupby+Aggregation  
  1937.   
  1938.   keys:groupby  
  1939.   
  1940.   aggregators:Aggregation  
  1941.   
  1942.   groupKeyNotReductionKey:false  
  1943.   
  1944.   groupByMemoryUsage:默认为0.5  
  1945.   
  1946.   memoryThreshold:默认为0.9    
  1947.   
  1948.   
  1949.   
  1950.   
  1951.   
  1952. 3)map端不部分聚合,数据倾斜,两个MR生成。  
  1953.   
  1954. genGroupByPlan2MR:  
  1955.   
  1956.   
  1957.   
  1958. 3.1)ReduceSinkOperator  
  1959.   
  1960.       处理groupby子句,getGroupByForClause,groupby的column加入reduceKeys和outputKeyColumnNames  
  1961.   
  1962.       处理select中的Distinct,getDistinctFuncExprsForClause,Distinct的column,加入reduceKeys和outputKeyColumnNames  
  1963.   
  1964.       处理聚合函数,getAggregationExprsForClause,须要作聚合的column加入reduceValues和outputValueColumnNames  
  1965.   
  1966.  public ReduceSinkDesc(java.util.ArrayList<ExprNodeDesc> keyCols,  
  1967.   
  1968.       int numDistributionKeys,  
  1969.   
  1970.       java.util.ArrayList<ExprNodeDesc> valueCols,  
  1971.   
  1972.       java.util.ArrayList<java.lang.String> outputKeyColumnNames,  
  1973.   
  1974.       List<List<Integer>> distinctColumnIndices,  
  1975.   
  1976.       java.util.ArrayList<java.lang.String> outputValueColumnNames, int tag,  
  1977.   
  1978.       java.util.ArrayList<ExprNodeDesc> partitionCols, int numReducers,  
  1979.   
  1980.       final TableDesc keySerializeInfo, final TableDesc valueSerializeInfo) {  
  1981.   
  1982.     this.keyCols = keyCols; // 为reduceKeys,groupby+distinct  
  1983.   
  1984.     this.numDistributionKeys = numDistributionKeys; // grpByExprs.size()  
  1985.   
  1986.     this.valueCols = valueCols; //reduceValues,聚合函数  
  1987.   
  1988.     this.outputKeyColumnNames = outputKeyColumnNames; //outputKeyColumnNames  
  1989.   
  1990.     this.outputValueColumnNames = outputValueColumnNames; //outputValueColumnNames  
  1991.   
  1992.     this.tag = tag; // -1  
  1993.   
  1994.     this.numReducers = numReducers; // 通常都是-1  
  1995.   
  1996.     this.partitionCols = partitionCols; // groupby  
  1997.   
  1998.     this.keySerializeInfo = keySerializeInfo;  
  1999.