Hive 配置单元-巨大的10TB表重新分区(添加新的分区列)

Hive 配置单元-巨大的10TB表重新分区(添加新的分区列),hive,hdfs,hbase,cloudera,impala,Hive,Hdfs,Hbase,Cloudera,Impala,技术人员 背景- 我们有10TB的现有配置单元表,它已经在列A上进行了范围分区。业务案例有一些更改,现在除了列A之外,还需要添加分区列B 问题陈述- 由于HDFS上的数据太大,需要重新构造以继承新的分区列B,所以我们面临着将表上的数据复制到备份上并使用简单的IMPALA INSERT OVERRITE将其重新摄取到主表中的困难 我们想探索是否有有效的方法来处理向如此庞大的表中添加分区列的问题好吧 如果我正确理解您的情况,那么您有一个表,该表由10 TB的HDFS数据支持,分区位于列a上,并且您还

技术人员

背景- 我们有10TB的现有配置单元表,它已经在列A上进行了范围分区。业务案例有一些更改,现在除了列A之外,还需要添加分区列B

问题陈述- 由于HDFS上的数据太大,需要重新构造以继承新的分区列B,所以我们面临着将表上的数据复制到备份上并使用简单的IMPALA INSERT OVERRITE将其重新摄取到主表中的困难

我们想探索是否有有效的方法来处理向如此庞大的表中添加分区列的问题

好吧

如果我正确理解您的情况,那么您有一个表,该表由10 TB的HDFS数据支持,分区位于列a上,并且您还希望在列B上添加分区

因此,如果列B将成为子分区,HDFS目录将看起来像user/hive/warehouse/database/table/colA/colB或/colB/colA,否则将其视为托管表

手动重新构造HDFS目录不是一个好主意,因为扫描所有文件上的数据并将其相应地组织到相应的文件夹中将成为一场噩梦

下面是一种方法

一,。创建一个具有新结构的新表,即在列a和列B上有分区

CREATE TABLE NEWTABLE ( COLUMNS ... ) PARTITON ON ( COL_A INT, COL_B INT )
2.a。将数据从旧表插入步骤1中创建的新表,如下所示

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
但是,如果处理不当,这个步骤在执行过程中会消耗大量资源,HDFS中的空间用于将结果存储为NEWTABLE的数据,当然还有时间

2.b。如果您认为HDFS将没有足够的空间来容纳所有数据或资源紧缩,我建议您在每次插入操作后将旧数据移除,并分批插入

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='abc'

DELETE FROM OLDTABLE
WHERE COL_A='abc'

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='def'

DELETE FROM OLDTABLE
WHERE COL_A='def'

.
.
.
so on.
通过这种方式,您可以卸载已处理数据的HDF并平衡空间

如果您遵循步骤2.b。然后,您可以编写一个脚本,通过为每次运行动态传递从SHOW分区派生的分区名称来自动化此过程。但是,在使用自动化之前,请手动尝试前两次尝试,以确保一切按预期进行

如果有帮助,请告诉我