我知道分区表用于水平分配负载,但它们的确切用途是什么?任何人都可以用一个简单的例子向我解释一下吗?
答案 0 :(得分:2)
分区允许Hive访问您的数据子集,而无需阅读所有数据。这是为什么它可能有用的一个具体例子。为了使这个易于理解,我的解释非常简单,我建议在其他地方读取Hive分区,如果你想要的不仅仅是我想要提供的表面层次理解。
您每天以~1TB
的速度收到带时间戳的数据。对于~100TB
的总数据加载,您有100天的数据。通常,您希望在过去10天内汇总一些数据。如果没有分区,您将不得不读入所有100TB
数据,即使Hive中的大部分都会被忽略,因为它与您的日期过滤器(在WHERE子句中)不匹配。如果按日期进行分区,Hive会将数据拆分为每天的块,每个块都有~1TBGB
。 Hive会查看您的WHERE子句,并提前确定哪些分区将通过过滤器并仅处理该数据。在这种情况下,我们只需要查看10TB
数据,这将大大减少我们对群集资源的使用并增加作业完成时间。现在,即使我们有1000天的数据总计1PB
,我们仍然只需要查看10TB
数据。
在实践中,许多Hive查询通常只关心总数据量的明确定义的子集。考虑哪些列经常为WHERE子句指定范围(或单个特定值)。您甚至可以在多个列上进行分区。例如,如果我们的颜色列有10种可能的颜色,并且每种颜色每天负责大约100GB的数据,我们可能会另外对颜色进行分区。然后,如果我们只关心过去10天的red
数据,我们只需要处理1TB
个数据。
小心不要过度分区。从我的日期示例中,您可能会认为如果日期分区良好,则将时间戳分区为第二个更好。理论上,这将允许您仅提取您关心的行。但是,如果这样做,您的分区最终将变得非常小,Hive不能很好地处理非常小的文件。对于太多列的分区存在同样的问题。另一件需要注意的事情是您的数据在您正在分区的列上的分布情况。如果您的数据的90%具有颜色black
,则9%具有颜色red
,并且剩余的1%在其他8种颜色中分开,那么您将拥有一些巨大的和一些微小的分区,这是不理想。
分区还有一些其他好处,例如减少底层数据的文件大小。这是通过从支持表的文件中取出该列并将该列的值放在包含该分区的文件夹中来实现的。
通过阅读您的问题,您似乎在寻找有关分区表的答案。托管与外部表是一个完全独立的问题,应该有自己的问题。
答案 1 :(得分:0)
Hive托管表完全由hive管理,Hive在自己的数据仓库中创建表(数据源)的副本,在删除hive时,它自己负责从仓库中删除该文件。在托管表的计数器中, 外部表直接由hive在创建表时使用External关键字创建,不会复制仓库中的任何数据。在丢弃表期间,数据将保持不变。