技术专家
背景- 我们有10TB的现有配置单元表,该表已在A列上进行了分区分区。业务案例已进行更改,现在除了A列之外还需要添加分区B列。
问题陈述-
由于HDFS上的数据太大,需要进行重组以继承新的分区列B,因此我们面临着将表复制到备份并使用简单的IMPALA INSERT OVERWRITE
重新插入主表的困难。
我们想探讨是否存在/有效的方法来处理将分区列添加到如此庞大的表中
答案 0 :(得分:1)
好的!
如果我正确理解了您的情况,则您的表中有10 TB的HDFS数据支持,并且在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数据和时间的存储空间。
OR
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
)来自动执行此过程。但是,在进行自动化之前,请先尝试前两次尝试,以确保一切按预期进行。
让我知道是否有帮助!