hive-10tb表重分区(添加新的分区列)

emeijp43  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(391)

技术人员,
背景-我们有10tb的现有配置单元表,它已经在列a上进行了范围分区。业务案例有一些变化,除了列a之外,现在还需要添加分区列b。
问题陈述—由于hdfs上的数据太大,需要重新构造以继承新的分区列b,因此我们很难使用simple将表复制到备份并重新摄取 IMPALA INSERT OVERWRITE 进入主表。
我们想探索是否有有效的方法来处理向如此庞大的表中添加过分区列的问题

yqyhoc1h

yqyhoc1h1#

好吧!
如果我正确地理解了您的情况,那么您在hdfs中有一个由10tb数据支持的表,该表的分区在列a上,并且您还希望在列b上添加分区。
因此,如果列b将成为子分区,hdfs目录将看起来像user/hive/warehouse/database/table/cola/colb或/colb/cola(将其视为托管表)。
手动重新构造hdfs目录并不是一个好主意,因为扫描所有文件上的数据并将其相应地组织到相应的文件夹中将成为一场噩梦。
下面是一种方法,
1创建一个具有新结构的新表,即在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.

这样,您就可以卸载已处理数据的hdfs并平衡空间。
如果你按照步骤2.b。然后您可以编写一个脚本,通过传递分区名称(派生自 SHOW PARTITIONS )为每次运行动态更新。但是,在使用自动化之前,请手动尝试前两次尝试,以确保事情按预期进行。
如果有用请告诉我!

相关问题