通过将分区目录复制到仓库中来复制 Hive managed table

Copying Hive managed table by copying partition directories into warehouse

我有一个现有的分桶 table,它具有 YEAR, MONTH, DAY 分区,但我想通过 INGESTION_KEY 添加额外的分区,现有 [=] 中不存在的列39=]。这是为了适应未来的 table 插入,这样我就不必在每次为该日期摄取数据时都 OVERWRITE 一个 YEAR, MONTH, DAY 分区;我可以做一个简单的 INSERT INTO 并创建一个新的 INGESTION_KEY 分区。

我的新 table 需要一年的数据才能开始,所以我想将一年的分区从现有的 table 复制到新的 table。与其对每个分区都做一个 Hive INSERT,我认为使用 distcp 将文件复制到 HDFS 中 Hive 仓库目录中新的 table 的分区目录会更快,然后 ADD PARTITION 到新的 table.

所以,这就是我所做的一切:

hadoop distcp /apps/hive/warehouse/src_db.db/src_tbl/year=2017/month=02/day=06 /apps/hive/warehouse/dest_db.db/dest_tbl/year=2017/month=02/day=06/ingestion_key=123

hive -e "ALTER TABLE dest_tbl ADD PARTITION (year=2017,month=02,day=06,ingestion_key='123')"

两者都被管理 tables,新的 table dest_tbl 被相同的列聚集到与 src_tbl 相同数量的桶中,并且唯一的架构的不同之处在于添加了 INGESTION_KEY

到目前为止,我的 SELECT * FROM dest_tbl 显示新 table 中的所有内容看起来都很正常。所以我的问题是:这种方法有什么问题吗?以这种方式 INSERT 到托管的、分桶的 table 是否不好,或者如果没有对复制的数据进行转换,这是 INSERT 的 acceptable 替代方案吗?

谢谢!!

虽然我更喜欢通过 Hive 查询复制只是为了在 Hive 中完成所有操作,但是使用其他工具复制数据文件是可以的,但是..

  • 有一个添加新分区元数据的专用命令,你可以用它代替alter table add partition..,它可以一次添加多个分区:

    MSCK REPAIR TABLE dest_tbl;
    
  • 继续使用 Hive 默认分区格式:partionKey=partitionValue