hive的insert语句列顺序问题以及新增字段遇到的坑
讲问题之前,先简单创建⼀个表:
CREATE TABLE IF NOT EXISTS `my.test_table`(
`col1` int COMMENT "第⼀列",
`col2` int COMMENT "第⼆列"
)
COMMENT "测试表"
PARTITIONED BY (`pt` int COMMENT "测试分区")
ROW FORMAT SERDE
"org.apache.hadoop.hive.OrcSerde"
STORED AS INPUTFORMAT
"org.apache.hadoop.hive.OrcInputFormat"
OUTPUTFORMAT
"org.apache.hadoop.hive.OrcOutputFormat";
初始表有col1,col2两列,pt分区只是为了对⽐结果
insert语句列顺序
hive不像mysql、oracle这些数据库⼀样在insert的时候可以指定字段,必须在插⼊的时候插⼊的是全字段。所以我⼀直以为可以通过指定插⼊数据的别名来改变插⼊字段的顺序,好吧,事实证明我是错的!
我们来简单作⼀个设想,假如我们执⾏以下的sql会发⽣什么:
insert overwrite st_table partition(pt=1) select2as col2, 1as col1 line_table;
按常规逻辑来说,查询的时候应该是col1字段都为1,col2字段都为2。但是事实上执⾏
select col1, col2 st_table;
结果是:
21
insert语句字段顺序21
21
21
....
事实上,hive并不关⼼你执⾏insert语句所⽤的别名,别名代表的字段可以不存在,甚⾄⽐别名都可以相同。下⾯的语句执⾏也是⼀样的效果:
insert overwrite st_table partition(pt=1) select2as invalid_col, 1as invalid_col line_table;
是不是觉得很惊喜。所以,请严格保证insert语句中的字段和建表语句中的字段的顺序⼀致!!!
对新增字段插⼊数据再查询发现是NULL
hive⽐较特殊的地⽅,在于它的表结构和数据其实是分开的。这个会导致,对hive分区表新增字段后,在执⾏插⼊分区的动作,会发现其实数据⽂件中已经有新字段值了,但是在查询的时候新字段的值还是显⽰为null。
例如我执⾏了下⾯的⽅法新增了⼀列col3:
alter st_table add columns(col3 int comment '第三列')
然后想插⼊⼀些数据:
insert overwrite st_table partition(pt=1) select1as col1, 2as col2, 3as col3 line_table;
结果查询col1,col2,col3发现结果其实是:
12NULL
12NULL
...1
这是因为你对表结构进⾏了改变,但是历史分区的数据却没有做改变(新增分区不会出现这个情况)。
为了解决上⾯的问题,可以采⽤两种⽅式:
如果已经执⾏添加操作,并且没有带cascade,可以尝试下⾯的⽅法:
使⽤replace 恢复表结构,这样历史的分区数据都不会消失
alter table industry_db.product replace
columns(product_name string comment ‘产品名’);
在新增的时候加上cascade关键词
alter st_table add columns(col3 int comment '第三列') cascade
官⽅⽂档描述如下:
The CASCADE|RESTRICT clause is available in Hive 1.1.0. ALTER TABLE ADD|REPLACE COLUMNS with CASCADE
command changes the columns of a table's metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.
如上所述,在1.1.0中表和分区的元数据就是分开处理的,在增加字段的时候添加CASCADE能同时更新表和分区对于,在添加字段的时候没有指定的cascade 的情况
因为我们在重跑数据的时候,虽然HDFS上的数据更新了,但是我们查询的时候仍然查询的是旧的元数据信息(即Mysql中的信息)
注意:对于执⾏了add column语句之后新⽣成的分区,是不会有问题的,Hive会⾃动维护新分区中的元数据。
转载请注明出处:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。