好的!
如果我正确理解您的情况,您在 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 后删除旧数据操作。
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)来自动执行此过程。但是,在使用自动化之前手动尝试前两次尝试,以确保一切按预期进行。
如果有帮助请告诉我!