0

我知道分区表用于水平分配负载,但它们的确切用途是什么?有人可以用一个简单的例子向我解释吗?

4

2 回答 2

2

分区允许 Hive 访问数据的子集,而无需读取所有数据。这是一个具体的例子,说明为什么这可能有用。为了使这一点易于理解,我的解释非常简化,如果您想要的不仅仅是我试图提供的表面级别的理解,我建议您阅读其他地方的 Hive 分区。

~1TB您以每天的速率接收带有时间戳的数据。您有数据可以追溯到 100 天,总数据负载为~100TB. 很多时候,您希望汇总过去 10 天的一些数据。如果没有分区,您将不得不读入所有100TB数据,即使 Hive 无论如何都会忽略其中的大部分数据,因为它与您的日期过滤器不匹配(在您的 WHERE 子句中)。如果按日期分区,Hive 将每天将数据分成块,每个块都带有~1TBGB. Hive 查看您的 WHERE 子句并提前确定哪些分区将通过过滤器并仅处理该数据。在这种情况下,我们只需要查看10TB数据量将大大减少我们对集群资源的使用并增加作业完成时间。现在,即使我们总共有 1000 天的数据,1PB我们仍然只需要查看10TB数据。

在实践中,许多 Hive 查询只关心总数据量中定义明确的子集是很常见的。考虑一下您经常在 WHERE 子句中为哪些列指定范围(或单个特定值)。您甚至可以在多个列上进行分区。例如,如果我们有一个包含 10 种可能颜色的颜色列,并且每种颜色每天负责大约 100GB 的数据,我们可能会另外按颜色进行分区。那么如果我们只关心red过去 10 天的数据,我们只需要处理1TB数据。

但请注意不要过度分区。从我的日期示例中,您可能会认为如果按日期进行分区很好,那么将时间戳分区到秒会更好。从理论上讲,这将允许您只提取您关心的行。但是,如果您这样做,您的分区最终会变得非常小,并且 Hive 不能很好地处理非常小的文件。对太多列进行分区也存在同样的问题。要注意的另一件事是您的数据在您要分区的列上的分布情况。如果 90% 的数据有颜色black,9% 有颜色red,剩下的 1% 被分成其他 8 种颜色,那么你会有一些大的和一些小的分区,这是不理想的。

分区还有其他一些好处,比如减少底层数据的文件大小。这是通过从支持表的文件中取出该列并将该列的值放入包含分区的文件夹中来实现的。

通过阅读您的问题,您似乎正在寻找有关分区表的答案。托管与外部表是一个完全独立的问题,应该有自己的问题。

于 2013-10-24T15:57:15.280 回答
0

Hive 托管表完全由 hive 管理,Hive 在自己的数据仓库中创建表(数据源)的副本,并且在删除 hive 时它自己负责从仓库中删除该文件。在托管表的计数器中,直接外部表是hive在建表时使用External关键字创建的,不会复制仓库中的任何数据。在删除表数据将保持不变。

于 2014-06-28T14:42:13.433 回答