我们在使用动态分区的进程中,有时候需要新增字段,新增之后,发现该字段一直为空,无论怎么插入数据,该字段值始终不变。过去的做法就是把表删了,重建带新字段的新表,问题就解决了,今天尝试了一种新的方法,也完美解决了这个问题。
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];--简单些:
alter table tb_name alter column_name cascade/restrict;
我们添加字段的时候选择CASCADE,再往老分区里面重新写入数据,该字段就能更新了。
原理:
cascade
有递归的含义,在删除数据库时加上它,不论该数据库下是否有表,一律删除;
在修改分区表的时候,会把所有分区全部修改,分区太多,修改会耗更长时间;
restrict
在删除表时,加上该关键字,如果该数据库下有表,不会删除;
在修改分区表时,不会修改老分区,只修改新分区,即:不管以前,只修改当前。
而restrict 是默认值,避免误删等误操作,如果有特殊需求,我们要带上cascade
hive> drop database test1;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database test1 is not empty. One or more tables exist.)
hive>
我的操作:
1.数据库现有2016和2017年的数据:
Partition test1.apd_bas_bay_p_f1{buy_year=2016} stats: [numFiles=1, numRows=272, totalSize=8167, rawDataSize=180608]
Partition test1.apd_bas_bay_p_f1{buy_year=2017} stats: [numFiles=1, numRows=206, totalSize=6766, rawDataSize=135960]
2.添加字段:
hive> alter table APD_BAS_BAY_P_F1 add columns(buy_month int) restrict;
OK
Time taken: 0.192 seconds
3.更新2016,2017年的数据:
INSERT overwrite table APD_BAS_BAY_P_F PARTITION(BUY_YEAR) SELECT ID,SEQ_ID,CNAME,PHONE_NUM,PRODUCT_NAME,PRODUCT_CODE,PRICE,AMT,TOTAL_COST,BUY_DATE,BUY_WAY_FALG,SUBSTR(BUY_DATE,0,4) AS BUY_YEAR FROM BAK.APD_BAS_BAY_P_F_BAK WHERE SUBSTR(BUY_DATE,0,4)<2018;
4.查看结果:
hive> select * from APD_BAS_BAY_P_F1 where buy_year=2017;
OK
2 s00002 钱维言 18355249330 iphoneXR iphoneXR 5599 1 5599 2017/11/16 17:45 1 NULL 2017
4 s00004 黎玲丞 17689073874 iphoneXR iphoneXR 5599 1 5599 2017/9/14 21:28 1 NULL 2017
11 s00011 邱可达 13777770406 iphoneXR iphoneXR 5599 1 5599 2017/11/9 13:14 1 NULL 2017
13 s00013 彭华柴 18087071823 华为P30pro HWP30P 3499 1 3499 2017/8/21 21:30 2 NULL 2017
17 s00017 董琛雄 13739393668 华为P30pro HWP30P 3499 1 3499 2017/12/21 8:25 2 NULL 2017
18 s00018 崔谚征 17742572922 iphoneXR iphoneXR 5599 1 5599 2017/12/6 14:54 2 NULL 2017
21 s00021 汪芸冉 14507260060 oppoR20 oppoR20 3599 1 3599 2017/10/31 15:51 1 NULL 2017
34 s00034 龚言字 13345452438 华为mate20pro mate20P 5999 1 5999 2017/8/19 19:50 1 NULL 2017
36 s00036 谢彤沂 15600489793 华为mate20X mate20X 4999 5 24995 2017/10/19 17:34 1 NULL 2017
40 s00040 龚悦 17768059644 荣耀20 H20 2499 1 2499 2017/8/1 12:47 1 NULL 2017
41 s00041 吴煌 15070716341 小米9 M9 3499 1 3499 2017/9/29 20:09 2 NULL 2017
49 s00049 董竹延 18686139632 oppoR20 oppoR20 3599 1 3599 2017/12/25 10:40 1 NULL 2017
54 s00054 蔡辅 19902324268 oppoR20 oppoR20 3599 1 3599 2017/10/18 17:15 1 NULL 2017
59 s00059 苏海焓 18777776176 iphoneXR iphoneXR 5599 1 5599 2017/12/3 10:03 1 NULL 2017
63 s00063 杜恬忆 17845519083 荣耀20 H20 2499 1 2499 2017/8/29 14:55 2 NULL 2017
64 s00064 许谦 17048385976 华为P20 mate20B 12999 1 12999 2017/10/27 21:11 1 NULL 2017
65 s00065 江梅丰 17328046851 小米9 M9 3499 1 3499 2017/9/15 21:48 2 NULL 2017
83 s00083 杨寒功 17332351757 荣耀v20 Hv20 2999 1 2999 2017/10/5 18:23 1 NULL 2017
91 s00091 覃承 15334762451 荣耀20pro H20P 3499 1 3499 2017/12/24 11:21 2 NULL 2017
新增的字段仍是空值。
5.插入2018和2019年的数据,查询:
hive> select * from APD_BAS_BAY_P_F1 where buy_year=2018;
OK
1 s00001 陶娴依 17609686974 iphoneXR iphoneXR 5599 1 5599 2018/1/1 15:41 1 201801 2018
3 s00003 贺梅 18626038839 华为mate20保时洁 mate20B 12999 1 12999 2018/1/20 14:25 1 201801 2018
5 s00005 彭胜骏 13427744202 华为mate20 mate20 3399 1 3399 2018/6/3 11:00 1 201806 2018
6 s00006 余珊绮 17237083372 oppoR20 oppoR20 3599 1 3599 2018/12/27 21:54 1 201812 2018
7 s00007 郭冉 13384397593 荣耀20 H20 2499 1 2499 2018/2/19 11:29 1 201802 2018
8 s00008 苏文展 13192977655 iphoneX iphoneX 5999 1 5999 2018/11/2 20:58 2 201811 2018
12 s00012 韩易 17873194514 三星肝垃圾X GLSX 6599 1 6599 2018/2/11 20:45 1 201802 2018
14 s00014 陆舒融 13183431414 iphoneX iphoneX 5999 1 5999 2018/9/27 20:31 2 201809 2018
20 s00020 王萱小 14949639352 oppoR20 oppoR20 3599 1 3599 2018/9/24 19:24 1 201809 2018
24 s00024 董大东 18514676812 红米2 RM2 999 1 999 2018/6/1 9:01 1 201806 2018
25 s00025 黎予昭 15366888184 华为mate20 mate20 3399 1 3399 2018/11/23 14:41 1 201811 2018
27 s00027 唐昌臣 15943404630 华为mate20pro mate20P 5999 1 5999 2018/12/5 9:12 1 201812 2018
28 s00028 向翰丰 13372258092 华为mate20X mate20X 4999 1 4999 2018/3/12 19:55 1 201803 2018
32 s00032 朱兰梦 19804773033 华为mate20pro mate20P 5999 1 5999 2018/7/18 13:37 2 201807 2018
35 s00035 潘沧俯 13866501242 荣耀v20 Hv20 2999 1 2999 2018/8/31 11:11 1 201808 2018
38 s00038 徐芸 14580998733 iphoneX iphoneX 5999 1 5999 2018/1/18 20:03 1 201801 2018
39 s00039 刘冉钰 16698339809 小米9 M9 3499 1 3499 2018/10/13 11:44 1 201810 2018
可以看到新分区可以更新。
cascade模式各个分区数据都会更新,不再演示。