【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)

这篇具有很好参考价值的文章主要介绍了【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

需求:需要在之前上线的分区报表中新增加一列。


实现方案:

1、创建分区测试表并插入测试数据

drop table test_1;
create table test_1
(id string,
score int,
name string
)
partitioned by (class string)
row format delimited fields terminated by ',';

insert overwrite table test_1
partition (class='A')
values('a',92,'lily'),('b',102,'mike');

查看原有分区表test_1的表结构

 desc test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库

2、新增加一列 grade,数据类型为strIng

alter table test_1 add columns(grade string);

查看添加列之后的数据结构

desc test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库

3、新增加列grade有数据后,插入新的分区B数据正常显示,原来A区grade列为NULL。

insert overwrite table test_1
partition (class='B')
values('a',92,'John','良好'),('b',112,'Jeff','优秀');

select * from test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库

原因是: hive使用新增加列语句,只修改了hive的元数据, 并没有改变hdfs的数据文件。

显示Table和Partition的详细信息,及表数据存放的hdfs的数据文件路径。

desc formatted test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库

查看具体分区的hdfs的数据文件路径

hadoop fs -lsr hdfs://b1/apps/database/hive/database/test_1

hive表增加分区列,hive,hive,hadoop,数据仓库

查看A、B两个分区下的hdfs的数据文件的内容,发现A区并没有grade的内容。

A区:

hadoop fs -cat hdfs://b1/apps/database/hive/database/test_1/class=A/000000_0

hive表增加分区列,hive,hive,hadoop,数据仓库

B区:

hadoop fs -cat hdfs://b1/apps/database/hive/database/test_1/class=B/000000_0

hive表增加分区列,hive,hive,hadoop,数据仓库


问题描述:

为了表的旧分区新增加列有数据,尝试重新写入A区的数据,发现A区新增列还是为NULL,重写分区后只有最新分区(B区)的新增列有数据。

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

select * from test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库


原因分析:

“alter table test_1 add columns(grade string);”,hive新增加列只修改了更新分区的表结构(metadata),没有变更旧分区的表结构。

表的表结构

hive表增加分区列,hive,hive,hadoop,数据仓库

A分区的表结构

desc formatted test_1 partition(class='A');

hive表增加分区列,hive,hive,hadoop,数据仓库
B分区的表结构

desc formatted test_1 partition(class='B');

hive表增加分区列,hive,hive,hadoop,数据仓库

查看表的表结构和新增分区的表结构(B区)是一致,与旧分区的表结构(A区)不一致。


解决方案:

  • 方法一:删除原来的分区数据重新插入
alter table test_1 drop partition (class='A');

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

select * from test_1;

hive表增加分区列,hive,hive,hadoop,数据仓库

  • 方法二: 最初,需要在增加grade时加上cascade关键字,cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。

添加列的语法

ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]  

注意:ALTER TABLE ADD|REPLACE COLUMNS with CASCADE command changes the columns of a table’s metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.

drop table test_1;
create table test_1
(id string,
score int,
name string
)
partitioned by (class string)
row format delimited fields terminated by ',';

insert overwrite table test_1
partition (class='A')
values('a',92,'lily'),('b',102,'mike');

alter table test_1 add columns(grade string) cascade;

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

hive表增加分区列,hive,hive,hadoop,数据仓库

如果已经执行添加操作,并且没有带cascade,可以尝试下面的方法:

alter table test_1 replace columns(id string ,score int,name string);

再重新带上cascade进行添加列的操作。


扩展

需求:增加一列,指定增加到原始的两列中间

1、新增加列grade

alter table test_1 add columns (grade string comment '新添加的列') cascade;

hive表增加分区列,hive,hive,hadoop,数据仓库

2、再对grade列进行排序(注意:必须添加cascade关键字,不然不会刷新旧分区数据,关键字cascade能修改元数据)

更新列的语法

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
--将grade增加到score列与name中间
alter table test_1 change column grade grade string after score cascade;

hive表增加分区列,hive,hive,hadoop,数据仓库文章来源地址https://www.toymoban.com/news/detail-720155.html

到了这里,关于【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive分区表修改(增删)列

    环境:CDH6.3.0,Hive 2.1.1-cdh6.3.0 基础数据分区表test1,包含a,b,c,d共4列加分区列p_day,向其中插入两行数据 表中数据及parquet文件信息如下: test2表直接使用test1表的文件: 修复分区并查询数据 删除test2表的a列,看起来只有通过replace columns实现,但是运行报错,根据官方文档,只

    2023年04月26日
    浏览(70)
  • Hive 分区表新增字段 cascade

    在以前上线的分区表中新加一个字段,并且要求添加到指定的位置列。 加 cascade 操作 创建测试表 插入测试数据 查看现有数据 官网添加列的语法 注意: Hive 1.1.0 中有 CASCADE|RESTRICT 子句。 ALTER TABLE ADD|REPLACE COLUMNS CASCADE 命令修改表元数据的列,并将相同的更改级联到所有分区

    2024年02月11日
    浏览(42)
  • Hive ---- 分区表和分桶表

    Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 1. 创建分区表 2. 分区表读写数据 1)写数据 (1)load 数据准备 在/opt/module/hiv

    2024年02月10日
    浏览(50)
  • Hive 分区表和分桶表

    在《Hive 建表语句解析》文章中,建表的时候我们可以使用 PARTITIONED BY 子句和 CLUSTERED BY 子句来创建分区表和分桶表,为什么要创建分区表和分桶表呢?分区表和分桶表有什么区别呢? 1. 为什么分区 在Hive 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时

    2023年04月23日
    浏览(35)
  • Hive创建分区表并插入数据

    业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史数据。 分区表的创建本质是在HDFS创建了一

    2024年02月07日
    浏览(37)
  • 二次开发DataX以支持HIVE分区表

            最近在一个大数据的项目开发中使用到了数据同步工具DataX,但在使用过程中发现了DataX对HIve分区表的支持不太友好。         具体体现在将数据库中的数据同步到HIVE分区表时,写入目录为HIVE表分区为dt=XXXX,如果不提前创建该分区,会报目录不存在的错误,如

    2024年02月16日
    浏览(35)
  • 【Hive大数据】Hive分区表与分桶表使用详解

    目录 一、分区概念产生背景 二、分区表特点 三、分区表类型 3.1 单分区 3.2 多分区

    2024年02月03日
    浏览(35)
  • HIVE表数据快速构造(分区表、orc、text)

    引言 当需要在hive数仓中去创建测试表并构造测试数据时,通常需要在安装了hive客户端的服务器环境下,通过执行命令的方式建表。通过在HDFS上上传和加载数据文件的方式来加载数据到hive表中。其中操作算不得多复杂,但比较依赖对环境和命令的熟悉,并且操作不够可视化

    2024年02月16日
    浏览(33)
  • hive分区表之insert overwrite 注意事项

    hive version 3.1.3 以往我们插入分区 需要 insert ovewrite table  p_table partition(period_id=‘202212’)  select id name from xxxx;  或者是 insert overwrite table  select  id,name,period_id from table where period_id=202212 前者是指定分区,后者是动态分区。没啥好说的。 但是今天遇到一个问题,如果我查询的数

    2024年02月13日
    浏览(46)
  • 【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

    最近在使用海豚调度DolphinScheduler的Datax组件时,遇到这么一个问题:之前给客户使用海豚做的离线数仓的分层搭建,一直都运行好好的,过了个元旦,这几天突然在数仓做任务时报错,具体报错信息如下: com.alibaba.datax.common.exception.DataXException: Code:[HdfsReader-08], Description:[您尝

    2024年01月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包