精华内容
下载资源
问答
  • 2022-01-19 17:50:16

    结尾加上CASCADE好像就不需要刷新历史分区元数据了?

    ALTER TABLE Database.TableName ADD COLUMNS(col1  STRING  COMMENT '备注1') CASCADE;
     

    更多相关内容
  • 这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字段添加进来。这导致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:17
    hive分区表增加列 新增的列会以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 创建、删除、增加分区、增加字段

    目录

    hive建表

    内部分区表

    外部分区表

    表结构复制:

    hive表删除

    hive表重命名

    表修改操作

    增加分区

    修改分区

    删除分区

    新增表字段 


    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:28
    Hive分区表 Hive分区表对应的是HDFS上独立的文件夹,该文件夹存放的是该分区的所有数据,其实分区就是分目录。Hive通过分区把一个大的数据集根据业务需要分割成小的数据集,在查询时能够通过where关键词选择指定分区...
  • Hive 分区表增加字段并赋值

    千次阅读 2021-10-11 17:44:45
    今天接到一个需求,在原有的 hive 分区表中需要添加一个字段,并且原来的数据中这个字段还是需要赋值。后续这个值是由 ETL 任务去拉取的,所以只需要解决好原来的数据。 解决方案 为了数据不丢失,先把原备份,...
  • hive 分区表新增字段 刷新字段

    千次阅读 2022-01-25 17:14:17
    hive当天分区新增了字段,查询发现全是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:56
    hive表分区字段需要注意的问题 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:58
    Hive分区表新增字段 ALTER TABLE gdm.gdm_wt_minute ADD COLUMNS(turst4 Int); 有分区的话要指定是哪个分区,我这个的分区是按天分的,所以每个分区都要指定一下. 注意: 要先切换到该库 再执行. use gdm; alter ...
  • sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式...
  • 背景: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:48
    hive表修改分区数据
  • Hive表分区与分桶

    千次阅读 2021-01-12 05:51:30
    1.Hive分区表Hive使用select语句进行查询的时候一般会扫描整个内容,会消耗很多时间做没必要的工作。Hive可以在创建的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率。创建分区的语法:...
  • 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命令的其它用法...
  • 1.修改注释 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在修改字段类型时使用语法: 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|...
  • 原因:使用alter table语句更新结构时,由于默认更新现有结构,对原有分区无改动,导致原有分区改变数据时,新字段为NULL 测试过程: 创建测试: CREATE TABLE DEFAULT. COMPANYLEVEL_TEST( IDSTRING, PAR...
  • hive分区表添加字段问题 在分区表里增加字段后,向分区插入数据有两种情况: 1.分区在修改结构前存在 2.分区在修改结构前不存在 对于第二种情况,bug不存在 针对第一种情形, 执行alter ...
  • 由于之前的工作中就算是分区表中插入字段,也是只对当前数据负责,不需要管历史数据,所以没考虑过如果加字段之后,对历史分区如何插入数据的问题,直到一次面试,面试官问了这个问题,我决定用博客的形式记录下来,...
  • 情况:: test_table已有字段 (a,b,c)已有分区:day_key=20131201day_key=20131202day_key=20131203需求是需要添加一个字段d,用add加的字段在末尾并且重新生成 所有分区的数据步骤1.添加字段:alter table test_...
  • Hive表分区与索引

    千次阅读 2020-12-19 18:24:28
    hive表分区表分区是指将数据按照物理分层的方式进行区分开,加快查询的速度,同时也起到数据快照的作用!创建分区表的关键字:partitioned by ,可以指定单个字段也可以指定多个字段;partitioned by (dt String,...
  • 测试, 不按照 创建语句的分区 字段顺序,添加分区。 效果一样
  • 一般由于业务需要,会对hive有增加字段的操作,如下: ALTER TABLE 库名.表名 add columns (字段字段类型 comment '注释') ; 但是上面这种语法只能是对表的当前和以后新的分区生效,若存在历史分区,那么...
  • 一、Hive分区表新增字段二、Hive修改表名,列名,列注释,注释,增加列,调整列顺序,属性名等操作三、Hive分区表动态添加字段四、Hive分区表修改结构的问题五、hive改结构的两个坑六、Hive分区表新增字段+重...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,346
精华内容 9,738
关键字:

hive表添加分区字段