我理解Hive表中分区和分区的概念。但我想知道的是"我们何时进行分区以及何时进行分组?" 什么是可以说适合分区和分组的理想场景?
答案 0 :(得分:2)
使用分区和分组的主要原因。
分区表数据用于水平分配负载。
示例:如果我们将一个非常大的表名称作为"部件"而且我们经常跑#34;其中"将结果限制为特定零件类型的查询。
为了更快的查询响应,可以通过(PART_TYPE STRING)对表进行分区。一旦对表进行分区,它就会改变Hive构建数据存储的方式,Hive现在将创建子目录,这将反映分区的结构,如:
.../Parts/PART_TYPE = Engine-Part
.../Parts/Part_Type = Brakes
所以,现在如果你在桌子上运行查询"部件"与WHERE PART_TYPE =' Engine-Part' ,它只会扫描一个目录的内容PART_TYPE =' Engine-Part'
分区功能在Hive中很有用。但与此同时,执行其他查询可能需要很长时间。
另一个缺点是,如果我们创建了太多的分区,这反过来会创建大量不必要的Hadoop文件和目录,并且它会成为NameNode的开销,因为NameNode必须在内存中保留文件系统的所有metdata文件。
Bucketing 是另一种可用于进一步将数据划分为更易于管理的形式的技术。
示例:假设表" part_sale"有一个顶级分区" sale_date"并进一步划分为" part_type"作为二级分区。
这将导致太多小分区。
.../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
如果我们用#34; part_sale"表,并使用" part_type"作为我们表的bucketing列。此列的值将由用户定义的数字散列到buckets中。具有相同的" part_type"将始终存储在同一个存储桶中。您可以在创建表时指定存储桶的数量,以便固定存储桶的数量,并且数据没有波动。
答案 1 :(得分:0)
在Hive中分区: - 如果我们正在处理一个大型表并经常运行带有WHERE子句的查询,这些子句将结果限制为特定的分区列/列,那么我们应该利用hive的分区概念。对于更快的查询响应,Hive表可以是PARTITIONED BY(partition_cols_name)。它有助于以逻辑方式组织数据,当我们使用分区列查询分区表时,它允许hive跳过所有但相关的子目录和文件,所以如果分区正确完成,扫描变得容易。当基数(字段可能具有的值的数量)不高时应该完成。否则,如果分区太多,那么它就是namenode上的开销。
在蜂巢中徘徊: - 如果要在具有高基数的字段(字段可能具有的可能值的数量)上隔离数据,那么我们应该使用bucketing。如果我们只想要根据某些特定字段而不是整个数据的数据样本,那么分组可能是一个不错的选择。如果涉及一些地图侧连接,那么分段表是一个不错的选择。
答案 2 :(得分:0)
分区有助于消除数据(如果在WHERE子句中使用),其中bucketing有助于将每个分区中的数据组织成多个文件,因此同一组数据始终写在同一个存储桶中。在列的加入方面有很多帮助。 Hive Buckets只是另一种分解数据或将数据减少到更易管理的部分或相同部分的技术。例如,我们有一些表,其中包含date,employee_name,employee_id,salary,leaves等列。在此表中,只使用日期列作为顶级分区,而employee_id作为第二级分区导致太多小分区。我们可以使用HASH值进行分段或使用范围来存储数据。
Hive分区和Bucketing是,当我们进行分区时,我们为列的每个唯一值创建一个分区。但是可能存在需要创建大量微小分区的情况。但是,如果您使用bucketing,则可以将其限制为您选择的数字,并将数据分解为这些存储桶。在配置单元中,分区是目录,但存储桶是文件。
在配置单元中,默认情况下,bucketing不起作用。您必须设置以下变量才能启用分段。 set hive.enforce.bucketing = true;
答案 3 :(得分:0)
PARTITIONING
- 您希望使用所需的WHERE子句加载
BUCKETING