动态分区添加的新字段无法插入数据

我们在使用动态分区的进程中,有时候需要新增字段,新增之后,发现该字段一直为空,无论怎么插入数据,该字段值始终不变。过去的做法就是把表删了,重建带新字段的新表,问题就解决了,今天尝试了一种新的方法,也完美解决了这个问题。

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模式各个分区数据都会更新,不再演示。

  • 注意:所有数据都是自动生成的,如有侵权请告知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值