2017-05-21 68 views
0

同時分區和分段Hive表的好處是什麼? 我有一個表「訂單」,其中包含1M記錄,但記錄來自6個特定城市。 現在,如果我只鬥我的表訂單基於城市,我在我的倉庫目錄(Hive)中獲得6個不同的文件夾,每個文件夾對應於一個特定的城市和數據。分區和分區Hive表的優點是什麼?

當我分區,然後桶我的表訂單,仍然可以在我的倉庫目錄下看到相同的6個文件夾目錄下的配置單元。我嘗試使用16個桶,但仍然按照城市劃分數據文件夾。 下面是代碼:

 create table Orders (id int, name string, address string) 
     partitioned by (city string) 
     clustered by (id) into 16 buckets 
     row format delimited fields terminated by ',' 
     stored as TEXTFILE 

可有人請說明爲什麼蜂巢是表現這種方式。 另外,我運行了一些性能指標,如計數和分組。在分區分區表中,我沒有發現任何顯着的改進,只有分區或只分區。

謝謝。

我在12個內核上運行Hadoop,有8個集羣的36 Gb RAM。

回答

3

分區和分區是在物理層分割數據的兩種不同類型。

正如您所見,當您按列對錶進行分區時,將爲該列的每個值創建一個目錄。因此,您通常需要在基數較低的列上進行分區。其中最常見的分區列是date

使用分段,列值被哈希到固定數量的桶中。這也在物理上分裂你的數據。在你的情況下,如果你檢查city目錄中的文件,你會看到16個文件,每個桶有1個文件。 Bucketing通常用於高基數列。

那麼,分區和分區的優勢是什麼?由於數據是物理「分區」的,查詢層可以應用兩種類型的優化,稱爲分區修剪和桶修剪。當應用WHERE子句可以允許優化器應用修剪策略時,這些優化將啓動。例如,在你的情況下,你有6個目錄(城市)乘以16個文件(id桶),所以你的表中共有96個文件。如果您在city = "city1"中包含了where子句,則只有16個文件將被掃描,因爲分區修剪會啓動。如果您對id = 10101使用了where子句,則只能應用6個文件,因爲可以應用清理修剪。如果您同時應用城市過濾器和ID過濾器,則只需要掃描1個文件。

編輯: 正如在評論中指出,桶修剪只在Tez引擎中實現。因此,在理論上,桶可以被修剪,優化還沒有在Hive MR中實現。

+0

分區的權利,但bucketing理論和實踐之間存在差距http://stackoverflow.com/questions/43608422/hive-scanning-entire-data-for-bucketed-table。分段處理的優勢目前在SAMPLE/JOIN/GROUP BY操作中。 –

+0

@DuduMarkovitz不再有...桶修剪已經在Hive 2.0中實現https://issues.apache.org/jira/browse/HIVE-11525 –

+0

這張票似乎只與tez –