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 )为每次运行动态更新。但是,在使用自动化之前,请手动尝试前两次尝试,以确保事情按预期进行。 如果有用请告诉我!
1条答案
按热度按时间yqyhoc1h1#
好吧!
如果我正确地理解了您的情况,那么您在hdfs中有一个由10tb数据支持的表,该表的分区在列a上,并且您还希望在列b上添加分区。
因此,如果列b将成为子分区,hdfs目录将看起来像user/hive/warehouse/database/table/cola/colb或/colb/cola(将其视为托管表)。
手动重新构造hdfs目录并不是一个好主意,因为扫描所有文件上的数据并将其相应地组织到相应的文件夹中将成为一场噩梦。
下面是一种方法,
1创建一个具有新结构的新表,即在a列和b列上有分区。
2.a。将旧表中的数据插入新表(在步骤#1中创建),如下所示,
但是,如果处理不当,这一步在执行过程中将消耗大量资源,hdfs中的空间用于将结果存储为newtable的数据,当然还有时间。
或
2.b。如果您认为hdfs将没有足够的空间来容纳所有的数据或资源紧缩,我建议您在每次插入操作之后批量地删除旧数据。
这样,您就可以卸载已处理数据的hdfs并平衡空间。
如果你按照步骤2.b。然后您可以编写一个脚本,通过传递分区名称(派生自
SHOW PARTITIONS
)为每次运行动态更新。但是,在使用自动化之前,请手动尝试前两次尝试,以确保事情按预期进行。如果有用请告诉我!