我们什么时候应该去蜂巢的分区和桶装



我了解蜂巢表中分区和铲斗的概念。但是,我想知道的是"我们什么时候进行分区,什么时候去买水桶"?"什么是理想的情况,可以说适合分区和桶?

使用分区和铲斗的主要原因。

分区:

表数据的分区用于水平分配负载。

示例:如果我们的表格非常大,则通常运行"在"查询"将结果限制为特定零件类型的"查询"。

对于更快的查询响应,该表可以通过(part_type字符串(对表进行分区。一旦您将表分区划分,它会更改hive hive结构数据存储的方式,而Hive现在将创建子目录,这将反映分区的结构,如:

.../Parts/PART_TYPE = Engine-Part
.../Parts/Part_Type = Brakes

所以,现在,如果您在表"零件"上运行查询,则part_type ='engine-part' ,它将仅扫描一个目录part_type ='引擎 - 零件'

的内容

分区功能在Hive中很有用。但同时可能需要很长时间才能执行其他查询。

另一个缺点是,如果我们创建了太多的分区,而这些分区反过来又创建了大量的Hadoop文件和目录,这些文件和目录不必要地创建了Namenode的开销,因为Namenode必须将所有METDATAFILE保留在内存中的文件系统。

桶:

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

如果我们将" part_sale"表存储起来,然后使用" part_type"作为表格的存储列。此列的值将由用户定义的数字哈希键入存储桶中。带有相同" part_type"的记录始终存放在同一存储桶中。

在Hive中进行分区: - 如果我们要处理一张大表格,并且经常与将结果限制为特定分区/列的子句进行的查询,那么我们应该利用Hive的分区概念。对于更快的查询响应,可以通过(partition_cols_name(对hive表进行分区。如果正确完成分区,则扫描变得容易。当基数(字段可以拥有的可能值的数量(不高时,应该进行。否则,如果分区太多,则是Namenode上的开销。

蜂巢中的水桶: - 如果要在具有较高基数的字段上隔离数据(字段可以具有可能的值的数量(,那么我们应该使用铲斗。如果我们只需要根据某些特定字段而不是整个数据来示例数据,则可以是一个不错的选择。如果涉及某些地图侧的连接,则桶形表是一个不错的选择。

分区有助于消除数据,如果在Where子句中使用,则桶有助于将每个分区中的数据整理到多个文件中,因此,由于同一数据始终将同一数据写在同一桶中。有助于加入列。Hive Buckets不过是分解数据或将数据减少到更易于管理的零件或平等零件的另一种技术。例如,我们的表格带有列,诸如日期,employee_name,Employee_ID,薪金,薪金,叶子等列。在此表中,只需将日期列用作顶级分区,而雇员_id作为第二级分区会导致太多的小区分区。我们可以将哈希值用于铲斗或范围来存储数据。

hive分区和铲斗是,当我们进行分区时,我们为列的每个唯一值创建一个分区。但是,在某些情况下,我们需要创建很多细微的分区。但是,如果您使用水桶,则可以将其限制为您选择的数字并将数据分解到这些存储桶中。在Hive中,分区是目录,但存储桶是文件。

在Hive中,默认情况下的铲斗不起作用。您将必须设置以下变量才能启用存储桶。设置hive.enforce.bucketing = true;

PARTITIONING将在列中几乎没有唯一值时使用 - 您想加载所需的地方,而在此处

BUCKETING如果您的WHERE子句中有多个唯一值

最新更新