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

时间:2017-02-06 14:49:35

标签: hadoop hive hdfs hql hadoop-partitioning

我有一个包含YEAR, MONTH, DAY分区的现有分段表,但我希望按INGESTION_KEY添加其他分区,这是现有表中不存在的列。这是为了适应未来的表插入,这样我每次摄取该日期的数据时都不需要OVERWRITE YEAR, MONTH, DAY分区;我可以做一个简单的INSERT INTO并创建一个新的INGESTION_KEY分区。

我需要在新表中开始一年的数据,所以我想将现有表中的一年分区复制到新表中。不是为每个分区做一个Hive INSERT,我认为使用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相同数量的桶中,并且架构中唯一的区别是{{1}的添加}。

到目前为止,我的INGESTION_KEY显示新表中的所有内容都显示正常。所以我的问题是:这种方法有什么问题吗?如果没有对复制的数据进行转换,SELECT * FROM dest_tbl对托管的,分段的表是否不好,或者这是INSERT的可接受的替代方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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