2014-01-18 30 views
19

是否存在Hive查詢以快速查找表大小(即行數)而不啓動耗時的MapReduce作業? (這就是爲什麼我想避免COUNT(*)。)Hive查詢快速查找表大小(行數)

我試過DESCRIBE EXTENDED,但是產生了numRows=0這顯然是不正確的。

(很抱歉沒能福利局問題,我試着用搜索引擎和搜索沒有成功apache.org文檔)。

+0

檢查此[鏈接](https://stackoverflow.com/a/45304801/704381​​5)!希望它有助於:) –

回答

22

tblproperties將給出表的大小,如果需要的話可以用來抓取該值。

-- gives all properties 
show tblproperties yourTableName 

-- show just the raw data size 
show tblproperties yourTableName("rawDataSize") 
+1

顯然,只有當這些屬性對列可用時,給定的命令才起作用,默認情況下這些屬性不存在。 –

+0

@Jared,單元是什麼?字節? – Steven

+0

是的輸出是字節。此外,這僅適用於已經在其上運行統計信息的非分區表。 – Jared

-5

它是一個很好的問題。計數()將花費很多時間來查找結果。但不幸的是()是唯一的辦法。

還存在另一種方式(不能說比上面的情況下備用但更好等待時間):

設置屬性 組hive.exec.mode.local.auto = TRUE;

並運行相同的命令(從tbl中選擇count(*)),這會提供比以前更好的延遲。

+0

確實有其他方法。見下面的其他答案。 –

20

這裏是快速命令

ANALYZE TABLE tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)] COMPUTE STATISTICS [noscan]; 

例如,如果表已分區

hive> ANALYZE TABLE ops_bc_log PARTITION(day) COMPUTE STATISTICS noscan; 

輸出是

分區logdata.ops_bc_log {天= 20140523}統計:[numFiles = 37,numRows = 26095186,totalSize = 654249957,rawDataSize = 58080809507]

Part銀行足球比賽logdata.ops_bc_log {天= 20140521}統計:[numFiles = 30,= numRows行21363807,總計TOTALSIZE = 564014889,rawDataSize = 47556570705]

分區logdata.ops_bc_log {天= 20140524}統計:[numFiles = 35,= numRows行25210367,總計TOTALSIZE = 631424507,rawDataSize = 56083164109]

分區logdata.ops_bc_log {天= 20140522}統計:[numFiles = 37,= numRows行26295075,總計TOTALSIZE = 657113440,rawDataSize = 58496087068]

所用時間:5.252秒

+0

請注意,根據[文檔](https://cwiki.apache.org/confluence/display/Hive/StatsDev),「noscan」參數將阻止掃描文件以獲取正確的行數。你會得到總大小。在你的情況下,它可能已經工作,因爲你正在通過配置收集統計信息。 –

+0

@DanielLangdon是rawDataSize字節,塊或其他的單位嗎? – dlamblin

-1

使用實木複合地板格式來存儲外部/內部表格的數據。那麼你會得到更快的結果。

2

有關使用方法:

hdfs dfs -du -s -h /path/to/table/name