Hive分区表动态添加字段

  公司埋点项目,数据从接口服务写入kafka集群kafka集群消费写入HDFS文件系统,最后通过Hive进行查询输出。这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字段添加进来。这导Hive表结构也需要跟着变化,否则无法通过Hive查询到最新添加字段的数据。

 

解决办法

  为数据表添加字段,字段必须添加到已有字段的最后面。因为已经存在的数据是按照之前的表结构写入到HDFS文件中的,当添加新字段为了能兼容前面已经存在的数据。在新增的字段加到分区表后,之前已经存在分区表中的数据会为这些新增的字段赋予默认值NULL。

具体操作

hive> show databases; OK db_hive_test default Time taken: 0.014 seconds, Fetched: 2 row(s) Hive> use default; hive> show create table bp_rec_session; OK CREATE TABLE `bp_rec_session`( `appversion` string, …… `cpucs` string) PARTITIONED BY ( `idate` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://x.x.x.x:9000/bp/rec_session' TBLPROPERTIES ( 'last_modified_by'='ols', 'last_modified_time'='1519977809', 'parquet.compression'='SNAPPY', 'transient_lastDdlTime'='1519977809') Time taken: 0.024 seconds, Fetched: 65 row(s) hive> alter table bp_rec_session add columns(language string, loginType string); hive> show create table bp_rec_session; OK CREATE TABLE `bp_rec_session`( `appversion` string, …… `cpucs` string, `language` string, `logintype` string) PARTITIONED BY ( `idate` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://x.x.x.x:9000/bp/rec_session' TBLPROPERTIES ( 'last_modified_by'='ols', 'last_modified_time'='1519977809', 'parquet.compression'='SNAPPY', 'transient_lastDdlTime'='1519977809') hive> select * from bp_rec_session limit 1; OK 7.2 …… Y0MDY2OA=e5d3= 8 NULL NULL 20180105 Time taken: 0.139 seconds, Fetched: 1 row(s)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssffs.html