EXPLAIN語法
Hive提供EXPLAIN命令,顯示查詢的執行計划。語法如下:
EXPLAIN [EXTENDED] query
EXPLAIN語句使用EXTENDED,提供執行計划關於操作的額外的信息。這是典型的物理信息,如文件名。
Hive查詢被轉換成序列(這是一個有向無環圖)階段。這些階段可能是mapper/reducer階段,或者做metastore或文件系統的操作,如移動和重命名的階段。 EXPLAIN的輸出包括三個部分:
查詢的抽象語法樹
執行計划計划的不同階段之間的依賴關系
每個場景的描述
場景的描述,顯示了與元數據相關操作的操作序列。元數據會包括FilterOperator的過濾器表達式,或SelectOperator的查詢表達式,或FileSinkOperator的文件輸出名字。
例子
考慮下面的EXPLAIN查詢:
EXPLAIN FROM src INSERT OVERWRITE TABLE dest_g1 SELECT src.key, sum(substr(src.value,4)) GROUP BY src.key;
語句的輸出包含下面的部分
抽象語法樹
ABSTRACT SYNTAX TREE: (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_TAB dest_g1)) (TOK_SELECT (TOK_SELEXPR (TOK_COLREF src key)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_FUNCTION substr (TOK_COLREF src value) 4)))) (TOK_GROUPBY (TOK_COLREF src key))))
依賴圖
STAGE DEPENDENCIES: Stage-1 is a root stage Stage-2 depends on stages: Stage-1 Stage-0 depends on stages: Stage-2
這顯示,Stage-1是根階段,Stage-2在Stage-1完成后執行,Stage-0在Stage-2完成后執行。
每個階段的計划
STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: src Reduce Output Operator key expressions: expr: key type: string sort order: + Map-reduce partition columns: expr: rand() type: double tag: -1 value expressions: expr: substr(value, 4) type: string Reduce Operator Tree: Group By Operator aggregations: expr: sum(UDFToDouble(VALUE.0)) keys: expr: KEY.0 type: string mode: partial1 File Output Operator compressed: false table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.mapred.SequenceFileOutputFormat name: binary_table Stage: Stage-2 Map Reduce Alias -> Map Operator Tree: /tmp/hive-zshao/67494501/106593589.10001 Reduce Output Operator key expressions: expr: 0 type: string sort order: + Map-reduce partition columns: expr: 0 type: string tag: -1 value expressions: expr: 1 type: double Reduce Operator Tree: Group By Operator aggregations: expr: sum(VALUE.0) keys: expr: KEY.0 type: string mode: final Select Operator expressions: expr: 0 type: string expr: 1 type: double Select Operator expressions: expr: UDFToInteger(0) type: int expr: 1 type: double File Output Operator compressed: false table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe name: dest_g1 Stage: Stage-0 Move Operator tables: replace: true table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe name: dest_g1
這個例子,有2個map/reduce階段(Stage-1和Stage-2),還有一個文件系統相關階段(Stage-0).Stage-0簡單把結果從臨時目錄,移動到表dest_g1相關的目錄。
map/reduce階段包含2部分:
map/reduce場景本身包含2個部分:表映射到Map運算符樹的別名--這個映射,通知mapper運算符樹調用,處理特定表的行或先前的map/reduce階段的結果。在上面例子的Stage-1,原始表的行,被Reduce輸出運算符的運算符樹處理。類似,在Stage-2中,Stage-1的結果的行被Reduce輸出運算符的其他運算符樹處理。每個Reduce輸出操作符,根據元數據的標准,把數據分區到reducers。
Reduce操作符樹——這個操作符樹處理map/reduce任務的reducer的所有行。在例子的Stage-1,Reducer操作符樹開展局部聚合,而Stage-2的reduers操作符樹對Stage-1的局部聚合,做最終的聚合的計算。
翻譯自 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain