Hadoop 通过将分区目录复制到仓库来复制配置单元托管表

Hadoop 通过将分区目录复制到仓库来复制配置单元托管表,hadoop,hive,hdfs,hql,hadoop-partitioning,Hadoop,Hive,Hdfs,Hql,Hadoop Partitioning,我有一个现有的带扣表,它具有年、月、日分区,但我想通过摄取键添加额外的分区,这是一个在现有表中不存在的列。这是为了适应未来的表插入,这样我就不必在每次接收该日期的数据时都覆盖年、月、日分区;我只需在中插入一个简单的并创建一个新的摄取键分区 我需要在新表中保存一年的数据才能开始,所以我想将一年的分区从现有表复制到新表中。我认为使用distcp将文件复制到HDFS中配置单元仓库目录中新表的分区目录中,然后将分区添加到新表中,比为每个分区执行配置单元INSERT更快 所以,这就是我所做的: hadoo

我有一个现有的带扣表,它具有
年、月、日
分区,但我想通过
摄取键
添加额外的分区,这是一个在现有表中不存在的列。这是为了适应未来的表插入,这样我就不必在每次接收该日期的数据时都覆盖
年、月、日
分区;我只需在
中插入一个简单的
并创建一个新的
摄取键
分区

我需要在新表中保存一年的数据才能开始,所以我想将一年的分区从现有表复制到新表中。我认为使用
distcp
将文件复制到HDFS中配置单元仓库目录中新表的分区目录中,然后将分区添加到新表中,比为每个分区执行配置单元
INSERT
更快

所以,这就是我所做的:

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\u tbl
由同一列聚集到与
src\u tbl
相同数量的存储桶中,模式中唯一的区别是添加了
摄取键

到目前为止,my
SELECT*FROM dest\u tbl
显示新表中的所有内容看起来都正常。所以我的问题是:这种方法有什么问题吗?以这种方式将
INSERT
插入到一个托管的、带扣的表中是否不好,或者如果没有对复制的数据进行转换,这是
INSERT
的可接受的替代方法


谢谢

虽然我更喜欢通过配置单元查询进行复制,只是为了在配置单元中实现所有功能,但是使用其他工具复制数据文件是可以的,但是

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

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


虽然我更喜欢通过配置单元查询进行复制,只是为了在配置单元中实现所有功能,但是使用其他工具复制数据文件是可以的,但是

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

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


您不应该从
INSERT
的角度来考虑,而应该从备份/恢复操作的角度来考虑。配置单元元存储区不跟踪数据文件,只跟踪目录结构;因此,只要文件结构与元数据匹配,这是公平的。顺便说一句,这也是一种方便的方式,可以对生产数据进行采样并将其发送到测试或QA集群……您不应该考虑插入,而应该考虑备份/恢复操作。配置单元元存储区不跟踪数据文件,只跟踪目录结构;因此,只要文件结构与元数据匹配,这是公平的。。。