congzhong

场景描述

  公司埋点项目,数据从接口服务写入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)

上述查询结果中的两个"NULL"即为后面添加字段赋予的默认值!

 

相关文章: