【问题标题】:Copying Hive managed table by copying partition directories into warehouse通过将分区目录复制到仓库来复制 Hive 托管表
【发布时间】:2017-02-06 14:49:35
【问题描述】:

我有一个现有的具有YEAR, MONTH, DAY 分区的分桶表,但我想通过INGESTION_KEY 添加额外的分区,这是现有表中不存在的列。这是为了适应未来的表插入,这样我就不必在每次提取该日期的数据时都 OVERWRITEYEAR, 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_tblsrc_tbl按相同的列聚集到相同数量的桶中,唯一不同的架构是增加了INGESTION_KEY

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

谢谢!!

【问题讨论】:

  • 您不应该考虑INSERT,而应该考虑备份/恢复操作。 Hive 元存储不跟踪数据文件,只跟踪目录结构;所以只要文件结构与元数据匹配,就公平了。
  • 顺便说一句,这也是一种对生产数据进行采样并将其发送到测试或 QA 集群的便捷方式...

标签: hadoop hive hdfs hql hadoop-partitioning


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2011-11-03
    相关资源
    最近更新 更多