-
2022-01-19 17:50:16
结尾加上CASCADE好像就不需要刷新历史分区元数据了?
ALTER TABLE Database.TableName ADD COLUMNS(col1 STRING COMMENT '备注1') CASCADE;
更多相关内容 -
Hive分区表动态添加字段
2021-06-16 15:13:30这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字段添加进来。这导致Hive表结构也需要跟着变化,否则无法通过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表中增加字段后,向分区表中写入数据(包含新增字段),查询分区表数据发现新增字段值均为“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分区表增加字段
2021-06-05 15:05:17hive分区表增加列 新增的列会以null展示 插入数据后还是显示null 如果放到第二天的分区,就能查出数据hive分区表增加列
新增的列会以null展示
插入数据后还是显示null,但是在presto中还是能查到数据的,应该是和hive的表结构有关,修改Hive分区表结构以后,元数据库中的SDS中该表对应的CD_ID会改变,但是该表分区下面对应的CD_ID还是原来表的CD_ID。SDS表主要保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等
所以,要取mysql修改元数据,具体看这里添加链接描述
如果放到第二天的分区,就能查出数据
后来看到官方说hive分区表在加字段时要加一个cascade
alter table test add columns(fs string comment ‘分数’)cascade;
这要就能生效了drop table if exists test; create table test( `name` string COMMENT '姓名', `age` string COMMENT '年龄' ) COMMENT '1' PARTITIONED BY (dt string) stored as parquet LOCATION '/warehouse/yizun/dwd/test' TBLPROPERTIES('parquet.compression'='lzo'); insert into table test partition(dt='2021-06-04') values('zs','15'); #alter table test add columns(fs string comment '分数'); alter table test add columns(fs string comment '分数')cascade; insert into table test partition(dt='2021-06-04') values('ls','18','99'); insert into table test partition(dt='2021-06-05') values('ww','10','66');
-
hive建表语句 增加字段、分区基础操作
2022-03-04 11:17:03hive 表创建、删除、增加分区、增加字段目录
hive建表
IF NOT EXISTS : 表不存在才会创建
分隔符:field.delim是表的两个列字段之间的文件中的字段分隔符.
serialization.format是文件序列化时表中两个列字段之间的文件中的字段分隔符.
分区partition:创建表时可指定分区字段,多个分区字段之间可用“,”分割。
如:PARTITIONED BY (
`hp_settle_dt` string,trans_label string)内部分区表
CREATE TABLE IF NOT EXISTS `tbl_usr_bind_card_count`( `usr_id` string, `trans_flow` string, `trans_time` string, `phone` string, `cert_id` string, `card_no` string) PARTITIONED BY ( `hp_settle_dt` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='\;', 'serialization.format'='\;') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count';
路径:创建内部表时可指定路径,若路径不存在建表时会自动创该路径。不指定路径时会存放默认路径。
外部分区表
CREATE EXTERNAL TABLE IF NOT EXISTS `tbl_usr_bind_card_count`( `usr_id` string, `trans_flow` string, `trans_time` string, `phone` string, `cert_id` string, `card_no` string) PARTITIONED BY ( `hp_settle_dt` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='\;', 'serialization.format'='\;') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count';
关键字EXTENAL告诉hive这张表是外部的。
路径:创建外部表时可指定路径,表创建时不会自动生成指定路径,所以要先创建路径再创建表。不指定路径时会存放默认路径。
因为表是外部的,所以hive并非认为完全拥有这份数据。因此删除表并不会删除掉这份数据,但是描述表的元数据信息会被删掉。
表结构复制:
CREATE EXTERNAL TABLE IF NOT EXISTS tbl_usr_bind_card_count1 LIKE tbl_usr_bind_card_count LOCATION '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count1';
注:如果省略掉关键字EXTERNAL而且源表是外部表的话,那么生成的新表也将是外部表,如果源表是内部表,那么生成的表将是内部表。如果语句中包含EXTERNAL,即便源表是内部表,新创建的表也会是外部表。
hive表删除
DROP TABLE tbl_usr_bind_card_count;
hive表重命名
-- 将表tbl_usr_bind_card_count重命名为tbl_usr_bind_card_count2
ALTER TABLE tbl_usr_bind_card_count RENAME TO tbl_usr_bind_card_count2;
表修改操作
增加分区
-- 添加分区
ALTER TABLE tbl_usr_bind_card_count ADD IF NOT EXISTS
PARTITION(hp_settle_dt = 20220301);
-- 添加分区并指定路径
ALTER TABLE tbl_usr_bind_card_count ADD IF NOT EXISTS
PARTITION(hp_settle_dt = 20220301) LOCATION '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count/hp_settle_dt=20220301';
修改分区
ALTER TABLE tbl_usr_bind_card_count PARTITION(hp_settle_dt=20220301)
SET LOCALTION '/user/bdhysfas/data/tbl_usr_bind_card_count/hp_settle_dt=20220301';
删除分区
ALTER TABLE tbl_usr_bind_card_count DROP PARTITION(hp_settle_dt=20220301);
新增表字段
方案1:
ALTER TABLE tbl_oper_in_flow add columns(less_recovery double,remark1 string,remark2 string,remark3 string);
对于旧的分区的可正常查询,新加的字段值为空。但是旧的分区的数据无法插入或更新,新的分区可正产插入和查询。
方案2:
ALTER TABLE tbl_oper_in_flow add columns(less_recovery double,remark1 string,remark2 string,remark3 string CASCADE) ;
可加工旧的分区的历史数据,使所以分区的数据可正常查询和插入,但可能加载时间过长。
方案3:
此方案只适用于外部分区表
删除原表,重新创建新表,执行原表数据路径。但分区信息需重新加载。
-
hive添加分区字段
2017-12-12 11:40:17静态分区表: 一级分区表: CREATE TABLE order_created_partition ( orderNumber STRING , event_time STRING ) PARTITIONED BY (event_month string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; -
Hive的分区表
2021-01-20 12:15:28Hive分区表 Hive分区表对应的是HDFS上独立的文件夹,该文件夹存放的是该分区的所有数据,其实分区就是分目录。Hive通过分区把一个大的数据集根据业务需要分割成小的数据集,在查询时能够通过where关键词选择指定分区... -
Hive 分区表增加字段并赋值
2021-10-11 17:44:45今天接到一个需求,在原有的 hive 分区表中需要添加一个字段,并且原来的数据中这个字段还是需要赋值。后续这个值是由 ETL 任务去拉取的,所以只需要解决好原来的数据。 解决方案 为了数据不丢失,先把原表备份,... -
hive 分区表新增字段 刷新字段值
2022-01-25 17:14:17hive当天分区新增了字段,查询发现全是null 1、删除分区 ALTER TABLE test DROP PARTITION (dt='20220125'); 2、查看分区路径 desc formatted ods.test partition(dt='20220124'); 3、重建分区 ALTER TABLE ... -
《转》hive表时间分区字段
2020-06-21 17:16:56hive表分区字段需要注意的问题 https://www.iteye.com/blog/coderlxl201209164551-2178634 博客分类: hive hive分区 近期项目中使用hive做数据统计,创建了一些hive表,在这个过程中,涉及到了设计分区的问题... -
Hive分区表
2021-01-07 08:08:31一:简介 分区表就是根据指定字段的值进行分类、分组,字段值相同的分为一类然后存储在一个单独的HDFS文件中,多个类就存储在多个文件中。...静态分区适合分区字段的值比较少的情况。 动态分区:创建表 -
Hive分区表新增字段
2021-04-21 19:42:58Hive分区表新增字段 ALTER TABLE gdm.gdm_wt_minute ADD COLUMNS(turst4 Int); 有分区的话要指定是哪个分区,我这个表的分区是按天分的,所以每个分区都要指定一下. 注意: 要先切换到该库 再执行. use gdm; alter ... -
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
2020-06-06 20:39:44sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式... -
Hive为分区表修改字段类型
2021-08-31 21:11:58背景:CDP7.1.6 Hive3 执行sql: alter table A change column id string int cascade; hive已提交,没有语法错误,但执行不了。 操作: create table A_tmp like A; --(默认false),表示开启动态分区功能 ... -
修改hive表分区名称
2017-02-17 10:17:48hive表修改分区数据 -
Hive表的分区与分桶
2021-01-12 05:51:301.Hive分区表Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作。Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率。创建分区表的语法:... -
Hive分区表新增字段注意事项
2020-06-11 15:55:26对Hive表新增字段时,官方给出语法结构如下 ALTER TABLE table_name [PARTITION partition_spec] ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) [CASCADE|RESTRICT] 1 2 3 4 其中... -
Hive查看表的分区字段
2018-06-10 16:46:58查询某个表的分区信息:SHOW PARTITIONS employee;查看某个表是否存在某个特定分区键SHOW PARTITIONS employee PARTITION(country='US') DESCRIBE EXTENDED employee PARTITION(country='US')【SHOW命令的其它用法... -
hive修改表注释,字段注释,分区字段注释
2022-02-15 17:36:571.修改表注释 alter table 表名 set tblproperties...3.修改分区字段注释,需要在元数据库中执行 update partition_keys ps join tbls ts on ps.tbl_id = ts.tbl_id join dbs ds on ts.db_id = ds.db_id set ps.pkey... -
hive 分区表添加,修改,删除字段的坑
2020-04-23 15:31:25hive在修改表的字段类型时使用语法: ALTER TABLE table_name PARTITION partition_spec] CHANGE COLUMN] col_old_name col_new_name column_type COMMENT col_comment] FIRST|AFTER column_name] CASCADE|... -
Hive分区表增加字段新增字段为NULL解决方案
2021-11-13 14:04:27原因:使用alter table语句更新表结构时,由于默认更新现有表结构,对原有分区无改动,导致原有分区改变数据时,新字段为NULL 测试过程: 创建测试表: CREATE TABLE DEFAULT. COMPANYLEVEL_TEST( IDSTRING, PAR... -
hive分区表添加字段问题
2015-12-11 15:34:00hive分区表添加字段问题 在分区表里增加字段后,向分区表插入数据有两种情况: 1.分区在修改表结构前存在 2.分区在修改表结构前不存在 对于第二种情况,bug不存在 针对第一种情形, 执行alter ... -
hive分区表新增字段并且新增字段的数据要写入当前和历史分区三种方法
2021-05-09 15:55:22由于之前的工作中就算是分区表中插入字段,也是只对当前数据负责,不需要管历史数据,所以没考虑过如果加字段之后,对历史分区如何插入数据的问题,直到一次面试,面试官问了这个问题,我决定用博客的形式记录下来,... -
Hive学习小记-(9)hive分区表加字段**
2021-01-12 06:23:05情况:表: test_table已有字段 (a,b,c)已有分区:day_key=20131201day_key=20131202day_key=20131203需求是需要添加一个字段d,用add加的字段在末尾并且重新生成 所有分区的数据步骤1.添加字段:alter table test_... -
Hive表分区与索引
2020-12-19 18:24:28hive表分区表分区是指将数据按照物理分层的方式进行区分开,加快查询的速度,同时也起到数据快照的作用!创建分区表的关键字:partitioned by ,可以指定单个字段也可以指定多个字段;partitioned by (dt String,... -
Hive 分区, alter添加分区,字段顺序无所谓
2021-07-14 12:06:47测试, 不按照 创建语句的分区 字段顺序,添加分区。 效果一样 -
hive表添加字段/修改字段导致的查询报错
2021-11-01 14:06:32一般由于业务需要,会对hive的表有增加字段的操作,如下: ALTER TABLE 库名.表名 add columns (字段名 字段类型 comment '注释') ; 但是上面这种语法只能是对表的当前和以后新的分区生效,若存在历史分区,那么... -
Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作
2020-12-23 16:48:46一、Hive分区表新增字段二、Hive修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作三、Hive分区表动态添加字段四、Hive分区表修改表结构的问题五、hive改表结构的两个坑六、Hive分区表新增字段+重...