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'='',
'parquet.compression'='SNAPPY',
'transient_lastDdlTime'='')
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'='',
'parquet.compression'='SNAPPY',
'transient_lastDdlTime'='') 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表中增加字段后,向分区表中写入数据(包含新增字段),查询分区表数据发现新增字段值均为“NULL”!
原因分析:表结构新增字段与创建分区表的顺序不同,导致查询结果不同
1.创建分区在修改表结构之后(能获取新增字段值)
2.创建分区在修改表结构之前(不能获取新增字段值)
对于第二种情况,因为分区表在修改表结构之前已经存在,所有在修改表结构的时候,新增字段并没有被加到分区表中。
而第一种情况在创建分区表的时候,直接使用了最新的表结构,所有分区表中包含所有的字段。
解决办法:
对应第二种情况,在执行完修改表结构语句 alter table table_name add columns(column_name string)后,接着需要执行
语句 alter table table_name partition(partition_name='分区值') add columns(column_name string); 【假设分区表名‘分区值’】
Hive分区表动态添加字段的更多相关文章
- Sql动态添加字段的正确姿势
如何给指定表动态添加字段? 一.创建一张表[Tbl_AutoFileds] (tableName表名,fieldName字段名,dataType数据类型,length长度 isnull 是否允许为n ...
- 关于boostrapValidator动态添加字段(addField)验证的bug
每次码博客,都觉得自己怀才不遇,哎~脑袋有瑕疵,文笔拿不粗手,就直接上干货吧. 在使用boostrapValidator这个验证插件的时候,如果某一个字段是动态添加来的,我们需要调用方法:addFie ...
- Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作
一.Hive分区表新增字段 参考博客:https://blog.csdn.net/yeweiouyang/article/details/44851459 二.Hive修改表名,列名,列注释,表注释, ...
- Hive分区表创建,增加及删除
1.创建Hive分区表,按字段分区 CREATE TABLE test1 ( id bigint , create_time timestamp , user_id string) partition ...
- 【解决】hive动态添加partitions不能超过100的问题
Author: kwu [解决]hive动态添加partitions不能超过100的问题,全量动态生成partitions超过100会出现例如以下异常: The maximum number of d ...
- Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶
Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...
- Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)
首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...
- Hive的动态分区
关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition), ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
随机推荐
- JavaScript ES6 let、const
在ES6中,增加了2个声明变量的关键字:let 和 const.在这里将详细介绍let与var的区别.Babel对let的处理以及const的简单使用. 1. let 在ES6规范中增加了 let 关 ...
- sed 变量替换和Linux的特殊符号大全
1 sed支持两种方式的变量替换,建议使用下面的第二种,比较简单 这样就可以给变量a赋值很多特殊字符了,比如 赋值a='!@#¥%……' sed -n 's/echo/'"$a"' ...
- junit4X系列--Exception
原文出处:http://www.blogjava.net/DLevin/archive/2012/11/02/390684.html.感谢作者的无私分享. 说来惭愧,虽然之前已经看过JUnit的源码了 ...
- freemarker中值比较的写法
因为freemarker中不能使用<.>的方式进行值的比较,大于使用gt,小于使用lt.所以集合大于0判断,如下: <#if students?size gt 0><#i ...
- SQL SERVER 表最小行的一个纠结问题
昨天一个同事突然问我,说他在SQL 2000数据库创建如下表的时候,突然碰到了下面一条警告信息.SQL脚本和警告信息如下: IF OBJECT_ID(N'Log') IS NULL BEGINCRE ...
- mysql数据库在Linux下安装与配置
mysql是一种开放源代码的关系型数据库系统(RDBMS),使用最常用的数据库管理语言--结构化查询语句(SQL)进行数据库管理. 由于mysql的开源,因此任何人都可以在General Publ ...
- 话说CentOS6的启动流程
1.按下开机按钮,电脑的主板通电,电脑开始加电自检(POST,Power On and Self Test),测试主机的硬件是否满足开机的要求. 2.加载主板上的BIOS(Base Input/Out ...
- iOS-strong和copy【详细解读】
strong和copy是常用到的修饰符,那么什么时候用strong,什么时候用copy,先上一段代码再说(以下代码直接在ViewController中写): 先定义两个数组 ///strong @pr ...
- Restful、Jersey和JAX-RS
一:MVC与SpringMVC MVC:是一种思想,是一种设计模式 SpringMVC:是一个框架,实现了MVC这种思想. 之前:写JSP页面,比较繁琐.eg:在页面显示用户列表,我们会在JSP页面 ...
- Win7 64位操作系统中搭建C/C++的编译环境
通常使用IDE工具为 VS2010 .但是如果仅仅只是想在Windows中使用命令行对C/C++源码进行编译和运行.则需要使用 CL 命令方式或另外安装 Cygwin / MinWin 命令行编译器. ...