【发布时间】:2017-02-06 14:49:35
【问题描述】:
我有一个现有的具有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按相同的列聚集到相同数量的桶中,唯一不同的架构是增加了INGESTION_KEY。
到目前为止,我的SELECT * FROM dest_tbl 显示新表中的所有内容看起来都很正常。所以我的问题是:这种方法有什么问题吗?以这种方式将INSERT 转换为托管的分桶表是不是很糟糕,或者如果没有对复制的数据进行任何转换,这是否是INSERT 的可接受替代方案?
谢谢!!
【问题讨论】:
-
您不应该考虑
INSERT,而应该考虑备份/恢复操作。 Hive 元存储不跟踪数据文件,只跟踪目录结构;所以只要文件结构与元数据匹配,就公平了。 -
顺便说一句,这也是一种对生产数据进行采样并将其发送到测试或 QA 集群的便捷方式...
标签: hadoop hive hdfs hql hadoop-partitioning