2013-10-24 34 views
0

我知道分區表用於水平分佈負載,但它們的確切用途是什麼?有人可以用一個簡單的例子向我解釋嗎?什麼是在Hive中使用的分區表?

+1

檢查谷歌。有很好的答案。 –

+3

此外,[Hive Wiki](https://cwiki.apache.org/confluence/display/Hive/LanguageManual)也是學習的好地方。 –

回答

2

分區允許Hive訪問您的數據的一個子集,而無需全部讀取它。這是一個爲什麼可能有用的具體例子。爲了使這一點很容易理解,我在解釋時非常簡化,如果你想要比我想提供的表面層理解更多的話,我推薦閱讀其他地方的Hive分區。

您正在以每天~1TB的速率收到帶時間戳的數據。您有數據追溯到100天,總數據負載爲~100TB。很多時候,您想在過去10天內彙總一些數據。如果不進行分區,即使Hive無論如何都會忽略大部分數據,因爲它不符合日期過濾器(位於WHERE子句中),所以您將不得不讀取數據的所有100TB。如果按日期劃分,Hive會將數據拆分爲每天的數據塊,每個數據塊都有~1TBGB。 Hive會查看您的WHERE子句,並提前指出哪些分區將通過過濾器並僅處理該數據。在這種情況下,我們只需要查看​​的數據,這將大大減少我們對集羣資源的使用並提高工作完成時間。現在即使我們有1000天的數據總計爲1PB,我們仍然只需要查看數據的​​。

實際上,許多Hive查詢只關心定義好的全部數據量的子集是非常常見的。想想你經常在WHERE子句中爲哪些列指定範圍(或單個特定值)。你甚至可以在多個列上分區。例如,如果我們有一個包含10種可能顏色的顏色列,並且每種顏色每天負責大約100GB的數據,那麼我們可能會另外對顏色進行分區。那麼如果我們只關心過去10天內的red數據,我們只需要處理1TB的數據。

小心不要過度分區。從我的日期示例中,您可能會認爲如果按日期分區是好的,則將時間戳劃分爲第二個分區會更好。這在理論上可以讓你只吸引你關心的行。但是,如果你這樣做,你的分區將會變得非常小,Hive不能很好地處理非常小的文件。分區過多列也存在同樣的問題。還有一點需要注意的是,您的數據在您分區的列上的分佈情況如何。如果90%的數據的顏色爲black,9%的顏色爲red,其餘1%的顏色分爲其他8種顏色,那麼您將擁有一些不太理想的大型和小型分區。

分區還有其他一些好處,例如減少底層數據的文件大小。這是通過將該列從支持該表的文件中取出並將該列的值放入保存該分區的文件夾中來實現的。

從閱讀你的問題,似乎你正在尋找關於分區表的答案。管理vs外部表是一個完全獨立的問題,應該有自己的問題。

0

Hive託管表完全由Hive管理,Hive在其自己的數據倉庫中創建表(數據源)的副本,並在移除配置單元時自己負責從倉庫中刪除此文件。託管表的計數器, 外部表直接由配置單元在創建表時使用External關鍵字創建,並且不會複製倉庫中的任何數據。在下拉表數據將保持不變。

+0

問題是關於分區表,而不是外部表。 – Priyesh