2013-10-24 32 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