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

原文地址:https://www.cnblogs.com/congzhong/p/8494991.html

时间: 2024-11-05 22:00:23

Hive分区表动态添加字段的相关文章

Sql动态添加字段的正确姿势

如何给指定表动态添加字段? 一.创建一张表[Tbl_AutoFileds] (tableName表名,fieldName字段名,dataType数据类型,length长度  isnull 是否允许为null) 二.为[Tbl_AutoFileds]创建表触发器 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- ============================================= -- Author:<作者> -- Create

向elasticsearch中动态添加字段报错问题和向elasticsearch中添加嵌套数据类型数据--工作学习记录

今天在对已有的es库中进行update操作时发现update操作失败(提示说是操作不允许).然后发现原因是:es中type的“dynamic”属性为“strict”. 然后感觉有两种方法解决: 1.向type中新增字段,再动态添加 2.修改es中dynamic属性为true(这种的话改动太大就算了) 之后我就通过第一种方法进行解决.但是,要添加的数据类型是嵌套数据类型. 如果就像普通的数据那样进行添加的话,es引擎内部会把对象数组展开成扁平的数据结构,数据之间的依赖关系会丢失. 例如:"tag&

解决mysql的动态添加字段以及数据的方法(基于python3.6)

arr = [] #arr为列表 test = ','.join([item for item in arr]) #此处需要拼接,一定要列表的拼接,如果将列表转为元组,之后变成str带入到字段处是错误的(纠结了一上午,真是臭妹妹!) sql = "insert into customer ("+test+") values (%s)" % ','.join(['%s'] * len(arr))#sql文的拼接需要将列表的拼接直接放入,然后数据需要多个%s,之后再将列

Hive分区表创建,增加及删除

1.创建Hive分区表,按字段分区 CREATE TABLE test1 ( id bigint , create_time timestamp , user_id string) partitioned by (partition_key int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\n'; 2.增加Hive分区表 ALTER TABLE test1 ADD PARTITION(parti

【解决】hive动态添加partitions不能超过100的问题

Author: kwu [解决]hive动态添加partitions不能超过100的问题,全量动态生成partitions超过100会出现例如以下异常: The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions and hive.exec.max.dynamic.partitions.pernode. Maximum was set to: 100 解决100限制,可设置例

hive按当天日期建立分区表 | 动态往日期分区插入数据

hive建立分区表,以当天日期("2014-08-15")作为分区依据,hql如下: CREATE EXTERNAL TABLE IF NOT EXISTS product_sell( category_id BIGINT, province_id BIGINT, product_id BIGINT, price DOUBLE, sell_num BIGINT ) PARTITIONED BY (ds string) ROW FORMAT DELIMITED FIELDS TERMIN

Hive分区表简介

简介:如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办呢,这时我们引入分区的概念.Hive中的分区表分为两种:静态分区和动态分区. 1.静态分区: 可以根据PARTITIONED BY创建分区表,一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下. 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示. 分区建表分为2种,一种是单分区,也就是说在表

Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等操作,我们将在onCreate 创建方法中创建一张表和插入相关的值,通过db.execSQL()完成Sqlite的运行. ①openHelper2.java文件: public class openHelper2 extends SQLiteOpenHelper { private static f

Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填以及可见

我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设置字段的change事件 // form on load event function onLoad() { init();   pageAttr.delivery_from.addOnChange(deliveryFromChange); pageAttr.type.addOnChange(typ