在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