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

问题描述 投票:0回答:1

技术人员,

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

问题陈述 - 由于HDFS上的数据太大并且需要重新构建以继承新的分区列B,因此我们很难将表复制到备份上并使用简单的IMPALA INSERT OVERWRITE重新获取到主表中。

我们想要探索是否有/有效的方法来处理将分区列添加到如此庞大的表中

hive hdfs hbase cloudera impala
1个回答
1
投票

好的!

如果我理解你的情况,你有一个由HDFS中的10 TB数据支持的表,在A列上有分区,你想在B列上添加分区。

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

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

以下是一种方法,

1.使用新结构创建一个新表 - 即在Col A和Col 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操作后批量删除旧数据。

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派生)来编写脚本以自动执行此过程。但是,在进行自动化之前,请手动尝试前两次尝试,以确保按预期进行。

如果有帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.