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
相同数量的存储桶中,模式中唯一的区别是添加了摄取键
到目前为止,mySELECT*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集群……您不应该考虑插入,而应该考虑备份/恢复操作。配置单元元存储区不跟踪数据文件,只跟踪目录结构;因此,只要文件结构与元数据匹配,这是公平的。。。