Hive分区表修改(增删)列

2023-05-16

文章目录

  • 一、环境及测试数据
  • 二、 删除列
    • 2.1 测试表test2
    • 2.2 DDL删除列?
    • 2.3 代码连接Hive Metastore删除列
      • 2.3.1 同时更新表与分区元数据
  • 三、添加列
  • 结论
  • 参考链接

一、环境及测试数据

环境:CDH6.3.0,Hive 2.1.1-cdh6.3.0

基础数据分区表test1,包含a,b,c,d共4列加分区列p_day,向其中插入两行数据

create table test1(a int,b bigint,c float,d string) partitioned by(p_day string) stored as parquet;

insert into test1 partition(p_day) values(1,11,1.1,'str1','2022-11-19'),(2,22,2.2,'str2','2022-11-19');

表中数据及parquet文件信息如下:

0: jdbc:hive2://dev-master1:10000 > select * from test1;
+----------+----------+----------+----------+--------------+
| test1.a  | test1.b  | test1.c  | test1.d  | test1.p_day  |
+----------+----------+----------+----------+--------------+
| 1        | 11       | 1.1      | str1     | 2022-11-19   |
| 2        | 22       | 2.2      | str2     | 2022-11-19   |
+----------+----------+----------+----------+--------------+
[hive@dev-master1 tmp]$ hdfs dfs -get /user/hive/warehouse/debug_test.db/test1/p_day=2022-11-19/000000_0 ./
[hive@dev-master1 tmp]$ parquet-tools schema 000000_0
message hive_schema {
  optional int32 a;
  optional int64 b;
  optional float c;
  optional binary d (STRING);
}

[hive@dev-master1 tmp]$ parquet-tools cat 000000_0
a = 1
b = 11
c = 1.1
d = str1

a = 2
b = 22
c = 2.2
d = str2

二、 删除列

2.1 测试表test2

create table test2(b bigint,a int,c float) partitioned by(p_day string) stored as parquet;

test2表直接使用test1表的文件:

[hive@dev-master1 tmp]$ hdfs dfs -mkdir /user/hive/warehouse/debug_test.db/test2/p_day=2022-11-19
[hive@dev-master1 tmp]$ hdfs dfs -cp /user/hive/warehouse/debug_test.db/test1/p_day=2022-11-19/000000_0 /user/hive/warehouse/debug_test.db/test2/p_day=2022-11-19/

修复分区并查询数据

msck repair table test2;
select * from test2;
+----------+----------+----------+--------------+
| test2.b  | test2.a  | test2.c  | test2.p_day  |
+----------+----------+----------+--------------+
| 11       | 1        | 1.1      | 2022-11-19   |
| 22       | 2        | 2.2      | 2022-11-19   |
+----------+----------+----------+--------------+

2.2 DDL删除列?

删除test2表的a列,看起来只有通过replace columns实现,但是运行报错,根据官方文档,只有表的序列化方式为native SerDe(DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe)才能执行。

0: jdbc:hive2://dev-master1:10000> alter table test2 replace columns(b bigint,c float);
INFO  : Compiling command(queryId=hive_20221119180121_23e7971f-7b2f-4693-90b9-469ec44a97bd): alter table test2 replace columns(b bigint,c float)
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:null, properties:null)
INFO  : Completed compiling command(queryId=hive_20221119180121_23e7971f-7b2f-4693-90b9-469ec44a97bd); Time taken: 1.479 seconds
INFO  : Executing command(queryId=hive_20221119180121_23e7971f-7b2f-4693-90b9-469ec44a97bd): alter table test2 replace columns(b bigint,c float)
INFO  : Starting task [Stage-0:DDL] in serial mode
ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table debug_test.test2. SerDe may be incompatible
INFO  : Completed executing command(queryId=hive_20221119180121_23e7971f-7b2f-4693-90b9-469ec44a97bd); Time taken: 0.018 seconds
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table debug_test.test2. SerDe may be incompatible (state=42000,code=1)

2.3 代码连接Hive Metastore删除列

主要Maven依赖:

用代码连接Hive MetaStore修改可以成功:

package com.bigdata.databasetest.hive.metastore;

import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.thrift.TException;

import java.util.List;
import java.util.stream.Collectors;


/**
 * ClassName: HiveMetaStoreClientTest
 * Description:
 *
 * @author 0x3E6
 * @version 1.0.0
 * @date 2022/11/19 17:12
 */
public class HiveMetaStoreClientTest {

    public static void main(String[] args) throws TException {
        HiveConf hiveConf = new HiveConf();
        System.setProperty("HADOOP_USER_NAME", "hive");
        hiveConf.set(HiveConf.ConfVars.METASTOREURIS.varname, "thrift://dev-master1:9083");
        try (HiveMetaStoreClient client = new HiveMetaStoreClient(hiveConf)) {
            Table table = client.getTable("debug_test", "test2");
            List<FieldSchema> cols = table.getSd().getCols();
            cols = cols.stream().filter(fieldSchema -> !"a".equalsIgnoreCase(fieldSchema.getName())).collect(Collectors.toList());
            table.getSd().setCols(cols);
            client.alter_table("debug_test", "test2", table);
        }
    }
}

这样查询数据有问题,不论sql是否带分区:

select * from test2;
select * from test2 where p_day='2022-11-19';

查询结果为:

+----------+----------+--------------+
| test2.b  | test2.c  | test2.p_day  |
+----------+----------+--------------+
| 11       | NULL     | 2022-11-19   |
| 22       | NULL     | 2022-11-19   |
+----------+----------+--------------+

因为只改了表的元数据,而未改分区的元数据。

0: jdbc:hive2://dev-master1:10000> desc test2;
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| b                        | bigint                |                       |
| c                        | float                 |                       |
| p_day                    | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| p_day                    | string                |                       |
+--------------------------+-----------------------+-----------------------+
0: jdbc:hive2://dev-master1:10000> desc test2 partition(p_day='2022-11-19');
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| b                        | bigint                |                       |
| a                        | int                   |                       |
| c                        | float                 |                       |
| p_day                    | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| p_day                    | string                |                       |
+--------------------------+-----------------------+-----------------------+

具体原理及原因还未分析,但可以修复,只需要保持分区的列与表的列顺序一致,无法执行REPLACE COLUMNS语句,通过CHANGE COLUMNS语句将c列移动到a列之前:

alter table test2 partition(p_day='2022-11-19') change column c c float after b;
select * from test2 where p_day='2022-11-19';
+----------+----------+--------------+
| test2.b  | test2.c  | test2.p_day  |
+----------+----------+--------------+
| 11       | 1.1      | 2022-11-19   |
| 22       | 2.2      | 2022-11-19   |
+----------+----------+--------------+

2.3.1 同时更新表与分区元数据

ALTER TABLE语句可以添加CASCADE,更新表元数据的同时级联更新分区元数据,Hive MetaStoreClient API也可以使用带CASCADE的方法,前面的代码调用的HiveMetaStoreClient的alter_table(String dbname, String tbl_name, Table new_tbl)方法,可以调用alter_table(String defaultDatabaseName, String tblName, Table table, boolean cascade)方法,新建表test3与test2结构一致,也同样把test1的数据拷贝到表test3,再通过代码删除表test3的列a:

package com.bigdata.databasetest.hive.metastore;

import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.thrift.TException;

import java.util.List;
import java.util.stream.Collectors;


/**
 * ClassName: HiveMetaStoreClientTest
 * Description:
 *
 * @author 0x3E6
 * @version 1.0.0
 * @date 2022/11/19 17:12
 */
public class HiveMetaStoreClientTest {

    public static void main(String[] args) throws TException {
        HiveConf hiveConf = new HiveConf();
        System.setProperty("HADOOP_USER_NAME", "hive");
        hiveConf.set(HiveConf.ConfVars.METASTOREURIS.varname, "thrift://dev-master1:9083");
        try (HiveMetaStoreClient client = new HiveMetaStoreClient(hiveConf)) {
            Table table = client.getTable("debug_test", "test3");
            List<FieldSchema> cols = table.getSd().getCols();
            cols = cols.stream().filter(fieldSchema -> !"a".equalsIgnoreCase(fieldSchema.getName())).collect(Collectors.toList());
            table.getSd().setCols(cols);
//            client.alter_table("debug_test", "test2", table);
            client.alter_table("debug_test", "test3", table, true);
        }
    }
}

更新后表test3可正常查询:

0: jdbc:hive2://dev-master1:10000> select * from test3;
+----------+----------+--------------+
| test3.b  | test3.c  | test3.p_day  |
+----------+----------+--------------+
| 11       | 1.1      | 2022-11-19   |
| 22       | 2.2      | 2022-11-19   |
+----------+----------+--------------+

表与分区元数据也相同:

0: jdbc:hive2://dev-master1:10000> desc test3;
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| b                        | bigint                |                       |
| c                        | float                 |                       |
| p_day                    | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| p_day                    | string                |                       |
+--------------------------+-----------------------+-----------------------+
0: jdbc:hive2://dev-master1:10000> desc test3 partition(p_day='2022-11-19');
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| b                        | bigint                |                       |
| c                        | float                 |                       |
| p_day                    | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| p_day                    | string                |                       |
+--------------------------+-----------------------+-----------------------+

三、添加列

根据Hive文档,可通过ADD COLUMNS语句添加列,ADD COLUMNS语句会将指定的列添加到(除分区列外)其他列后面。

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]                         -- (Note: Hive 1.1.0 and later)

如果使用Hive MetaStoreClient API不小心将列加到了(除分区列)外其他列之间,且造成了表与分区列顺序不同,也可结合CHANGE COLUMNS语句修改表或分区的列顺序恢复即可:

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|RESTRICT];

结论

可以通过Hive MetaStoreClient API增删Hive列,但必须保持Hive表与各分区元数据的列顺序一致。

参考链接

  • Hive LanguageManual DDL
  • Parquet格式表重命名列名后Hive查询列数据显示NULL异常分析
  • Java调用Hive-metastore接口
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive分区表修改(增删)列 的相关文章

  • pycharm 不能单步调试(debug)的原因,或者点击debug不能进入断点。debug区域是灰色的

    如上图 xff0c 不要点击pycharm右上角的Debug 那样不能进入调试 xff08 在多个py文件都存在的情况下 xff09 xff0c 找到程序的入口点出 xff08 if name 61 61 34 main xff09 xff
  • 进程切换时是如何保存上下文的

    前言 当前操作系统大部分采用分时的进程调度 既每个进程运行一小段时间 然后切换到下一个进程运行 依次往复 当进程运行的时候是独占CPU的 此时操作系统是无法强行介入的 为了将执行权让出来 就需要硬件的配合了 硬件每个一个时钟周期 比如10m
  • 使用ROS节点控制PX4——总体流程

    1 安装ROS IDE xff1a Roboware Studio xff08 只支持linux xff09 网址 xff1a http www roboware me Roboware可以很方便的创建工作空间 xff0c 编写程序后可以自
  • 使用ROS节点控制PX4——位置控制

    上一篇简要介绍了ROS控制PX4并使用仿真环境进行调试的框架 点击打开链接 本篇将详细介绍ROS节点的发布与订阅细节 xff0c 并使用gazebo进行仿真调试 任务 xff1a 实现飞机的自动起飞 xff0c 然后在两点之间循环飞行数次
  • Odroid与电脑连接教程

    当我们在Odroid上安装了linnux系统后 xff0c 需要将电脑与Odroid进行连接 xff1a 一方面可以方便的把在电脑中调试成功的代码拷入odroid运行 xff0c 毕竟相比于电脑 xff0c Odroid还是很卡的 另一方面
  • Ue4行为树学习笔记 二

    Ue4行为树学习笔记 二 前言引用资料 行为树创建于布局任务设立 追逐随机巡逻AI控制器的设置最终设置尾声 前言 因为篇幅原因 xff0c 没看过上篇还请移步至 Ue4行为树学习笔记 一 引用资料 行为树快速入门指南 UE4学习笔记 xff
  • QGC Windows下编译环境搭建-------Qt5.7 + VS2015

    源码下载 打开qgc的github网址 xff0c 并选择最新的稳定版v3 4 https github com mavlink qgroundcontrol tree Stable V3 4 下载git xff0c 在电脑中进入希望下载的
  • ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: pip安装权限问题

    1 问题描述 xff1a 在使用pip安装transformers时 xff0c 报如下错误 xff1a pip install transformers ERROR Could not install packages due to an
  • 系统调用和函数调用的区别

    系统调用 操作系统服务的编程接口 通常由高级语言编写 xff08 C或C 43 43 xff09 程序访问通常通过高层次 的API接口 xff08 C标准库的库函数 xff09 而不是直接进行系统调用 每个系统调用对应一个系统调用编号 系统
  • FreeRTOS原理剖析:任务的基础知识

    1 任务的基础知识 1 1 前后台和多任务系统 在裸机程序中 xff0c 一般方式是在main 函数的while 1 中循环执行所有的程序 xff0c 有时 xff0c 使用中断去执行一些紧急的功能 xff0c 中断中执行的程序称为前台 x
  • FreeRTOS原理剖析:任务延时

    1 任务延时相关API函数 函数描述vTaskDelay 任务相对延时vTaskDelayUntil 任务绝对延时 xff0c 相对于任务相对延时而言 xff0c 即以一定的周期执行任务函数xTaskAbortDelay 任务中止延时函数
  • FreeRTOS原理剖析:空闲任务分析

    1 空闲任务相关API函数 函数描述portTASK FUNCTION 宏定义 xff0c 真正函数原型为void prvIdleTask void pvParameters 任务挂起中其它重要的API函数 介绍过的函数不列出 xff0c
  • FreeRTOS原理剖析:任务切换过程

    1 任务切换相关API函数 函数描述xPortPendSVHandler PendSV中断服务函数 xff0c 其实函数原型为PendSV Handler vTaskSwitchContext 检查任务堆栈使用是否溢出 xff0c 和查找下
  • FreeRTOS原理剖析:事件标志组

    1 事件标志组相关API函数 函数描述xEventGroupCreate 使用动态方式创建事件标志组xEventGroupCreateStatic 使用静态方式创建事件标志组vEventGroupDelete 删除事件标志组xEventGr
  • FreeRTOS原理剖析:任务调度器启动

    1 任务调度器启动相关API函数 函数描述vTaskStartScheduler 开启任务调度器 任务调度启动中其它重要的API函数 介绍过的函数不列出 xff0c 请参考前面的文章 xff1a 函数描述xPortStartSchedule
  • linux字符设备驱动 LED驱动程序

    1 字符设备驱动简介 Linux的外设主要分为三类 xff1a 字符设备 character device 块设备 block device 网络接口 network interface 字符设备是能像字节流一样读写操作的设备 xff0c
  • 学生时代的书单

    大话系列的书 xff0c 用独特的行文风格 xff0c 以风趣 幽默的语言向读者讲述 概念原理知识 xff0c 用漫画式的插图帮助读者理解晦涩 枯燥的技术 xff0c 让我们在快乐中掌握知识 xff01 1 大话通信 通信基础知识读本 作者
  • Linux字符时设备驱动 中断处理 按键

    1 Linux异常处理体系结构 Linux异常处理体系结构使用主要分成两步 xff1a 1 使用函数init IRQ 初始化中断体系结构 xff0c 源代码在arch arm kernel irq c中 2 用户使用函数request ir
  • [UAV] 无人机仿真平台搭建

    Amovlab 开源项目 从0开始的无人机仿真平台搭建1 基础环境1 1 新建本地代码仓库1 2 编译添加路径 xff08 记得 将Path To Prometheus替换成你的文件路径 xff09 1 3 安装ROS所需的其他插件或者库安
  • FreeRTOS之优先级反转实验

    1 创建二值信号和创建3个任务 xff0c LowPriority Task为最低优先级 xff0c HighPriority Task为最高优先级 注意 xff1a 动态创建任务时要注意大小 span class token keywor

随机推荐

  • FreeRTOS之StreamBuffer实验

    1 常用函数介绍 创建StreamBuffer函数 调用xStreamBufferCreate xff0c xStreamBufferCreate是个宏定义 xff0c 实际函数在下面 xff1a span class token comm
  • FreeRTOS之按键中断实验

    1 创建任务和二值信号量 span class token macro property span class token directive hash span span class token directive keyword inc
  • FreeRTOS之串口中断接收实验

    1 创建任务和消息队列 span class token macro property span class token directive hash span span class token directive keyword defi
  • linux下用Kazam录屏视频在windows不能播放解决

    描述 之前在ubuntu上记录一些东西 xff0c 但是转而在windows就不能播放 xff0c 查了一下资料说是解码器的问题 大概也有网友遇到类似问题 xff0c 那就分享一下吧 xff01 解决 windows上下载安装软件HandB
  • 位姿估计_1

    说在前面的话 位姿估计 xff08 Pose estimation xff09 在计算机视觉领域扮演着十分重要的角色 在使用视觉传感器估计机器人位姿进行控制 机器人导航 增强现实以及其它方面都有着极大的应用 位姿估计这一过程的基础是找到现实
  • 编译osgearth过程中遇到的问题

    1 关于libxxx so no version information available 的解决办法 删除软链接并建立新链接 2 gdal库编译不过 xff0c 报错undefined symbol sqlite3 column tab
  • 基于加速度计与气压计的三阶卡尔曼滤波计算加速度、速度及高度

    本文主要介绍了卡尔曼滤波器的使用原理 xff0c 给出了matlab代码 xff0c 并在STM32F407平台对卡尔曼滤波器进行了验证 xff0c 传感器为MPU6050与DPS310 xff0c 测试结果令人满意 xff0c 速度与高度
  • Ubuntu18.04基于ROS和PX4的仿真平台配置

    1 前言 作者只是一名双非本科院校飞控专业的大二学生 xff0c 想以此记录一下自学飞控的经历 xff0c 也希望能给刚刚入门的同学一些微薄的帮助 这个环境的安装可以说是西天取经一般 xff0c 但安装完后发现如果有领路的人 xff0c 其
  • ubuntu下通过浏览器下载软件包的路径及×××.tar.xz包的安装(1)

    ubuntu下大家一般都会通过软件下载中心安装 xff0c 而软件中心下载的软件一般在 var cache apt archives这个路径下 xff0c 当然一般软件中心对给你安装好 xff0c 所以该路径下的文件名是 deb的文件 同时
  • 基于AWSIM实现Autoware docker内仿真运行

    AWSIM是Autoware当前推荐使用的仿真工具 xff0c 内部采用ros2 for unity插件 xff0c 能够直接发送ros2消息而不同采用中间转接模块 xff0c 效率较高 进行软件开发时各种依赖包的版本管理是让人头疼的问题
  • 关于Apollo Cyber RT 中Component如何绑定到CPU Group、具体线程及优先级队列

    Apollo Scheduler 模块的工作原理如下图所示 xff1a 原图引用链接 xff1a 架构分析 Apollo CyberRT Framework分析 Scheduler调度器 HaoBBNuanMM的博客 CSDN博客 cybe
  • FreeRTOS任务相关基础知识

    一 单任务系统和多任务系统 单任务系统一般为裸机系统 xff0c while 1 做一个大循环 xff0c 也包含一些中断 xff0c 完成所有的程序逻辑处理 如果应用程序需求繁多 xff0c 程序设计复杂 xff0c 应考虑多任务系统 多
  • FreeRTOS任务切换——PendSV

    前言 xff1a 本文分析一下FreeRTOS任务切换相关内容 RTOS系统的核心是进行任务管理 xff0c 任务切换 本文分SVC和PendSV异常 任务切换场景 pendSV中断函数 FreeRTOS时间片调度4部分讲解FreeRTOS
  • ROS:OpenCV读取摄像头并发布话题

    ROS OpenCV读取本地照片发布到rviz中 ROS读取摄像头视频数据发布到rviz中 include lt ros ros h gt include lt image transport image transport h gt in
  • 一种动态更新flink任务配置的方法

    文章目录 1 原理2 例 xff0c 整数过滤2 1 并行度为12 2 并行度大于12 3 完整代码 参考链接 1 原理 参考Flink Spark 如何实现动态更新作业配置 xff0c 讲得比较详细 xff0c 这篇的文章的参考参考文献也
  • 一种Hudi on Flink动态同步元数据变化的方法

    文章目录 一 背景二 官方Schema Evolution例子三 Flink 43 Hudi实现Schema Evolution四 96 HoodieFlinkStreamer 96 流程浅析及扩展方法4 1 FlinkKafkaConsu
  • 一种处理Hive元数据与文件类型不同时SQL查询失败的方法

    文章目录 一 背景二 分析过程2 1 环境及测试数据2 1 1 环境2 1 2 测试数据 2 2 select语句异常分析2 2 1 异常分析2 2 2 捕获异常位置 2 3 insert overwrite语句异常分析2 3 1 异常分析
  • 一种处理Hive元数据与文件类型不同时SQL查询失败的方法(二)

    文章目录 一 异常触发SQL二 异常处理三 Hive on Spark依赖的Hive jar包部署 继上一篇之后 xff0c 又发现了一种新的报错位置 本篇对这种情况进行处理 xff0c 并验证这种处理方式是否适用于Hive on Spar
  • PX4代码CMakeLists.txt的简单解读

    分析一下PX4代码CMakeLists txt文件 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • Hive分区表修改(增删)列

    文章目录 一 环境及测试数据二 删除列2 1 测试表test22 2 DDL删除列 xff1f 2 3 代码连接Hive Metastore删除列2 3 1 同时更新表与分区元数据 三 添加列结论参考链接 一 环境及测试数据 环境 xff1