Hive analyze命令解析

2021-10-02 14:21:39 字數 3120 閱讀 7121

關於hive analyze命令

1. 命令用法:

表與分割槽的狀態資訊統計

analyze table tablename

[partition(partcol1[=val1], partcol2[=val2], ...)]

compute statistics [noscan];

列資訊統計

analyze table tablename

[partition(partcol1[=val1], partcol2[=val2], ...)]

compute statistics for columns ( columns name1 , columns name2…) [noscan];

當表存在分割槽時,需要在命令中指定,否則會報錯;

不支援使用列與表的別名

2. 某個有分割槽表的analyze命令執行結果:

partition default.test stats: [num_files: 1, num_rows: 0, total_size: 41, raw_data_size: 0]

table default.test stats: [num_partitions: 1, num_files: 1, num_rows: 0, total_size: 41, raw_data_size: 0]

3. 原始碼分析執行過程

命令的執行步驟:

當完成命令轉化完ast樹時 進入columnstatssemanticanalyzer類。

1) 命令型別的檢查( 比如 no scan , partial scan 等)

2) 查詢重寫,例如執行以下查詢:

analyze table pokes compute statistics for columns foo,bar;

以上查詢會根據ast樹,獲取 表名, 列名,列的數量和型別。分割槽名字,數量等資訊。生成乙個新的查詢:

select compute_stats(foo , 16 ) , compute_stats(bar , 16 ) from pokes

3) 生成新的ast樹

4) 回到driver 完成語法分析,生成查詢計畫。 在做語法分析時使用了新的ast樹和原有的ctx

5) 生成乙個列統計的任務替代fetch task,並寫統計資訊到metastore中。列統計任務的生成是通過mapreducecompiler 類中的gencolumsstatstask方法來完成的,每個task中都有對應的work 。核心**如下:

對於2中的查詢,所生成的roottasks 如下:

上圖中的mapredtask會執行一次聚合操作的rs.

6) 生成plan 。 對於2中的查詢,將會生成如下的plan:

,"querycounters":"null","stagegraph":,"stagelist":[","tasklist":[,,]},"operatorlist":[,,,],"done":"false","started":"false"},,]},"operatorlist":[,,],"done":"false","started":"false"}],"done":"false","started":"false"},","tasklist":,"done":"false","started":"false"}],"done":"false","started":"false"}

7) 列統計資訊的輸出schema

schema(

fieldschemas:[fieldschema(name:_c0,type:struct,comment:null),

fieldschema(name:_c1,type:struct, comment:null)],

properties:null)

以下是一些總結的資料:

1:列統計

針對表中的列數,特定列資料的直方圖,有多種方式可以實現。作為查詢優化的一種方法,統計輸入給優化器的代價函式,然後優化器比較不同的計畫,並從中獲取較優的計畫。

統計有時能夠滿足使用者的查詢,從而讓使用者,快速獲取結果(需執行儲存的統計資訊,而不需要觸發長時間的執行計畫)

注: 以上來自wiki 但目前還沒有實現統計輸入給優化器的這種優化。

2:範圍

hive 現在支援的表和分割槽級別的統計, 不支援列中資料的統計。由於這些表和分割槽的統計不足以完成1中所述通過cost model 計算獲取最優的計算。

統計首先要支援表和分割槽,這些統計會存在metastore中

比如分割槽:

• number of rows

• number of files

• size in bytes.

針對表,還包括表中的分割槽的格式number of partitions

針對分割槽級別的統計,可以實現列級別前n個值top k statistics

例項:假定有乙個表具有4個分割槽

• partition1: (ds='2013-03-08', hr=11)

• partition2: (ds='2013-03-08', hr=12)

• partition3: (ds='2013-03-09', hr=11)

• partition4: (ds='2013-03-09', hr=12)

執行命令如下

analyze table table1 partition(ds='2013-03-09', hr=11) compute statistics;

將只蒐集分割槽3

如果執行

analyze table table1 partition(ds='2013-03-09', hr) compute statistics;

則同時蒐集分區間3和4

如果執行

analyze table table1 partition(ds, hr) compute statistics;

則蒐集所有分割槽

針對分分割槽表,通過

analyze table table1 compute statistics;

檢視分割槽的統計資訊:

describe extended table1;

輸入類似:

... , parameters:, ....

例項:describe extended table1 partition(ds='2013-03-09', hr=11);

解析tar命令

tar命令的用法如下。摘自 鳥哥的私房菜 tar zxcvfpp tfile sfile 引數說明 z 是否同時具有 gzip 的屬性?x 解開乙個壓縮檔案的引數指令!t 檢視 tarfile 裡面的檔案!c 建立乙個壓縮檔案的引數指令 v 壓縮的過程中顯示檔案!f 使用檔名,請留意,在 f 之後要...

iptables命令解析

宣告 本文 bbs.chinaunix.net thread 2204793 1 1.html iptables 指令 語法 iptables t table command match j target jump t引數 用來指定規則表,內建的規則表有三個,分別是 nat,mangle和filte...

Vim 命令解析

qx 開始記錄巨集,並將結果存入暫存器x q 退出記錄模式 稍微解釋一下,當在normal模式下輸入 qx後,你對文字的所有編輯動作將會被記錄下來,再次輸入q即退出了記錄模 式,然後輸入 x對剛才記錄下來的命令進行重複,此命令後可跟數字,表示要重複多少次,比如 x20,可以重複20次。這個在文字的批...