2017-04-18 55 views

回答

0

在Hive中進行分區: - 如果我們正在處理一個大表,並且經常使用WHERE子句運行查詢,以將結果限制到特定的分區列/列,那麼我們應該利用hive的分區概念。對於更快的查詢響應,Hive表可以是PARTITIONED BY(partition_cols_name)。它有助於以邏輯方式組織數據,並且當我們使用分區列查詢分區表時,它允許配置單元跳過所有相關的子目錄和文件,所以如果分區正確完成,掃描變得容易。當基數(一個字段可能的值的數量)不高時應該完成。否則,如果分區太多,那麼它是namenode上的開銷。

Hive中的Bucketing: - 如果要分隔具有高基數(字段可能具有的值的數量)的字段上的數據,那麼我們應該使用分段。如果我們只需要根據某些特定領域的數據而不是整個數據,那麼分段可能是一個不錯的選擇。如果涉及一些地圖邊連接,那麼bucketed表是一個不錯的選擇。

0

分區有助於消除數據,如果在WHERE子句中使用,分段有助於將每個分區中的數據組織成多個文件,因此同一組數據總是寫入同一個分區。幫助加入專欄。 Hive Buckets不過是另一種分解數據或將數據減少爲更易於管理的部分或同等部分的技術。例如,我們的表格中包含日期,employee_name,employee_id,薪水,樹葉等列。在此表中,只使用日期列作爲頂級分區,而employee_id作爲第二級分區導致太多的小分區。我們可以使用HASH值作爲bucketing或範圍來存儲數據。

Hive分區和Bucketing是當我們進行分區時,我們爲每個唯一的列值創建一個分區。但是可能會出現我們需要創建大量小分區的情況。但是,如果您使用分段功能,則可以將其限制爲您選擇的數字並將數據分解到這些分段中。在配置單元中,分區是一個目錄,但存儲桶是一個文件。

在配置單元中,默認情況下分段不起作用。您必須設置以下變量才能啓用分段。設置hive.enforce.bucketing = true;

1

使用分區和分區的主要原因。

分區:

表數據的分區是用於水平地分配負載來完成。

示例:如果我們有一個非常大的表名稱作爲「零件」,並且經常運行「where」查詢將結果限制爲特定的零件類型。

有關更快的查詢響應,該表可以按(PART_TYPE STRING)進行分區。一旦你的分區表它改變了蜂巢結構中的數據存儲和現在蜂巢將創建子目錄,這將反映類似的分區結構:

.../Parts/PART_TYPE = Engine-Part 

.../Parts/Part_Type = Brakes 

所以,現在如果你在表上運行查詢「零件「與WHERE PART_TYPE ='引擎零件' ,它只會掃描一個目錄的內容PART_TYPE ='引擎零件'

分區功能在Hive中非常有用。但同時執行其他查詢可能需要很長時間。

另一個缺點是,如果我們創建了太多的分區,而這又會創建大量不必要的Hadoop文件和目錄,並且由於NameNode必須將文件系統的所有metdata文件保留在內存中,所以它成爲NameNode的開銷。

桶裝:

桶裝是可使用的數據,以進一步劃分成更容易管理的形式的另一種技術。

示例:假設表「part_sale」有「SALE_DATE」的頂部水平分區,它被進一步劃分成「零件類型」作爲第二級分區。

這將導致太多的小分區。

.../part_sale/sale-date = 2017-04-18/part_type = engine_part1 
.../part_sale/sale-date = 2017-04-18/part_type = engine_part2 
.../part_sale/sale-date = 2017-04-18/part_type = engine_part3 
.../part_sale/sale-date = 2017-04-18/part_type = engine_part4 

如果我們鬥「part_sale」表,並使用「零件類型」作爲我們此列的table.The價值的桶裝列將通過用戶定義的號碼被散列到buckets.Records具有相同「零件類型」將總是被存儲在相同的bucket.You可以在創建表時指定桶的數量,從而桶的該數目是固定的,存在與數據沒有波動。當有在列幾個唯一值

0

PARTITIONING將使用 - 你想加載您所需的WHERE子句

BUCKETING會在出現在where子句

多個唯一值可以使用