我有一个包含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
的可接受的替代方法?
谢谢!
答案 0 :(得分:2)
虽然我更喜欢通过Hive查询进行复制只是为了在Hive中完成所有操作,但是使用其他工具复制数据文件是可以的,但是..
有一个专用命令可以添加新的分区元数据,您可以使用它代替alter table add partition..
,它可以一次添加多个分区:
MSCK REPAIR TABLE dest_tbl;
继续使用Hive默认分区格式:partionKey=partitionValue