hive快速拷贝动态分区的两种方式

在hive仓库修改以前逻辑中,如果因为 一时的需要 增加了hive表的字段,后来在过些日子思考后感觉

这个业务不需要在增加这个字段, 在hive分区表中,

增加列语句, 需要增加 cascade,否则分区表在查询某天分区数据时会查不到

alter table ods_teach_online_coursewares ADD COLUMNS (ccdl_begtime string COMMENT '打点开始时间') CASCADE;

这里主要讨论的是,在分区表增加了列,后来又不需要这些列的处理方式:

1 这是我常用的方式,通过sql方式:

eg : 表1 需要将 列1,列2去掉,

那么,先创建好 去掉列1,2的这个表, 

然后hive命令行中如下:

 set hive.exec.dynamic.partition.mode=nonstrict;  必须设置

insert overwrite table ods_teach_online_coursewares_bak partition(day) 
select   在 select 具体列名时,必须要显示带上 day
province_id,
province_name,
city_id,
city_name,
county_id,
county_name,
school_id,
school_name,
grade,
class_id,
class_name,
subject_id,
subject_name,
book_id,
book_name,
unit_id,
unit_name,
ccl_coursewares_id,
coursewares_name,
is_collect,
pid,
courseware_creator,
creator_name,
creator_icon,
courseware_owner,
owner_name,
owner_icon,
ccl_id,
ccl_begtime,
ccl_endtime,
duration,
ccdl_type,
resource_count,
ccl_type,
day 
from ods_teach_online_coursewares  distribute by day; 

如下是加载样子:



 

如果是拷贝整个表的列,而不是只拷贝部分列,写法如下:

 insert overwrite table tmp_test partition(day)  select *  from dm_login_class_user_count_distribution_semester  distribute by day

方式2 :

方式2: 通过 hadoop cp命令 + hive msck repair命令组合使用

1 create table tmp_test1 like dm_login_class_user_count_distribution_semester;  创建目标表

2 hadoop fs -cp hdfs://Galaxy/user/hive/warehouse/dev_treasury.db/dm_login_class_user_count_distribution_semester/*  hdfs://Galaxy/user/hive/warehouse/dev_treasury.db/tmp_test1/    将原表hdfs数据拷贝到目标表 hdfs目录中

3 进入Hive环境中, 输入 MSCK REPAIR TABLE tmp_test1;

4 验证数据是否加载进来:

 > select * from  dm_login_class_user_count_distribution_semester where day='2016-12-12' limit 1;
OK
2016-12-12      4                                       3301            0                                       EDUCATION_STAFF 769     896     0       2016-12-12

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2407386