Hive分区表动态添加字段

Posted 天使的翅膀——

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=os, 
  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); //为分区表添加language和loginType字段

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=os, 
  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"即为后面添加字段赋予的默认值!

 

以上是关于Hive分区表动态添加字段的主要内容,如果未能解决你的问题,请参考以下文章

hive使用动态分区时如果动态分区的字段存在空值的问题

Hive动态分区与静态分区,数据插入,区别

Hive如何根据表中某个字段动态分区

Hive分区分桶

Hive分区参考

Hive表的动态分区和静态分区