我有一个具有YEAR, MONTH, DAY
分区的现有存储桶表,但我想通过INGESTION_KEY
添加其他分区,这是现有表中不存在的列。这是为了适应将来的表插入,这样我就不必在每次摄取该日期的数据时都OVERWRITE
YEAR, 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