通过将分区目录复制到仓库来复制 Hive 托管表



我有一个具有YEAR, MONTH, DAY分区的现有存储桶表,但我想通过INGESTION_KEY添加其他分区,这是现有表中不存在的列。这是为了适应将来的表插入,这样我就不必在每次摄取该日期的数据时都OVERWRITEYEAR, MONTH, DAY分区;我可以做一个简单的INSERT INTO并创建一个新的INGESTION_KEY分区。

我需要新表中一年的数据才能开始,因此我想将一年的分区从现有表复制到新表。与其为每个分区执行 HiveINSERT,我认为使用distcp将文件复制到 HDFS 中 Hive 仓库目录中的新表分区目录中,然后ADD PARTITION到新表会更快。

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

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')"

两者都是托管表,新表dest_tbl由同一列聚类到与src_tbl相同数量的存储桶中,并且模式上的唯一区别是添加了INGESTION_KEY

到目前为止,我的SELECT * FROM dest_tbl显示新表中的所有内容看起来都很正常。所以我的问题是:这种方法有什么问题吗?以这种方式INSERT托管的存储桶表是不好的,还是在没有对复制的数据执行转换的情况下,这是可接受的替代INSERT

谢谢!!

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

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

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

最新更新