【Hive 如何进行update更新?】

Hive 是一个基于 Hadoop 的数据分析工具,可以使用类 SQL 语法进行离线数据分析,节省学习成本和扩展功能。

Hive 最初设计时主要是面向批处理和大数据分析,并不直接支持UPDATE和DELETE操作,这是因为Hive的数据存储在HDFS上,而HDFS的设计遵循"一次写入,多次读取"的原则,不支持对文件的随机写入操作。因此,在Hive中没有直接的UPDATE语句,那么如何对数据进行更新修改呢?

我们可以通过其他的方式来间接实现数据的更新,这里介绍常用的几种: INSERT OVERWRITE 覆盖,临时表,临时分区。

1.INSERT OVERWRITE

通过覆盖原有数据的方式来间接实现更新,这种方法适用于数据量不大的情况。

假设现在有一张员工信息表,有 emp_id(员工编号),emp_name(员工名称),需要将emp_id = '1024' 的名称修改为 'CodeBoy'。

sql 复制代码
--示例
INSERT OVERWRITE emp_info
(emp_id
,emp_name
)
SELECT
emp_id
,CASE   WHEN emp_id = '1024' THEN 'CodeBoy'
        ELSE                       emp_name
 END     AS emp_name
FROM emp_info
WHERE ...
/*SQL*/;

2.临时表

临时表顾名思义临时存放数据的表,通过创建一张临时表,将需要修改数据的表数据插入复制到临时表中,再从临时表中按需要更新的加工逻辑进行代码加工后重新插入到正常表中,实现更新数据的功能。

假设现在有一张员工信息表,有 emp_id(员工编号),emp_name(员工名称),需要将emp_id = '1024' 的名称修改为 'CodeBoy'。

sql 复制代码
--示例
--1. 创建一张临时表 tmp_emp_info ,表结构和数据与 emp_info 保持一致
CREATE TABLE IF NOT EXISTS tmp_emp_info AS SELECT * FROM emp_info;
/*
* 如果是全表修改,可以先使用 truncate emp_info; 语句先将原表的数据全部删除,再直接 INSERT INTO 从临时表插入修改后的数据
* ,但是切记一定要慎重使用 trcuncate 语句,确保数据可以恢复及您的操作保证数据结果准确
*/
--2. 将临时表数据插入原表时对数据进行处理
INSERT OVERWRITE emp_info
(emp_id
,emp_name
)
SELECT
emp_id
,CASE   WHEN emp_id = '1024' THEN 'CodeBoy'
        ELSE                       emp_name
 END     AS emp_name
FROM tmp_emp_info
WHERE ...
/*SQL*/;
/*最后如果确保数据正确后可以删除临时表,减少存储压力*/
DROP TABLE IF EXISTS tmp_emp_info;

创建临时表备份数据可以见之前的文章:【Impala SQL 造数(一)】

3.临时分区

在进行大数据量处理和分析时,为了优化存储和查询效率,往往会把表建成分区表,如按日期分区,临时分区即可以是还没有数据的日期。

如果仅仅只是某个日期的数据需要修改更新,则可以只针对某个分区操作,与临时表类似,先把当前日期分区('2024-12-14')的数据复制到还没有建立的日期分区('9999-12-31')中,然后将临时分区数据修改更新后再重新插入正常分区中即可,临时分区较临时表的好处之一就是如果一张表有很多分区,仅操作某个分区比操作一张表的数据量较少。

sql 复制代码
-- 示例
--1. 将正常分区的数据复制到临时分区中
INSERT INTO emp_info
(
data_dt
,emp_id
,emp_name
)
SELECT
CAST( '9999-12-31'  AS DATE )  AS data_dt
,emp_id
,emp_name
FROM tmp_emp_info
WHERE data_dt = '2024-12-14'
AND emp_id NOT IN ('1024')
/*SQL*/;

--2.将临时分区的数据覆盖到正常分区
INSERT OVERWRITE emp_info
(
data_dt
,emp_id
,emp_name
)
SELECT
CAST( '2024-12-14'   AS DATE )  AS data_dt
,emp_id
,emp_name
FROM emp_info
WHERE data_dt = '9999-12-31'
/*SQL*/;

--3.将修改更新后的数据插入到正常分区中
INSERT INTO emp_info
(
data_dt
,emp_id
,emp_name
)
SELECT
CAST( '2024-12-14'  AS DATE    )  AS data_dt
,CAST( '1024'       AS STRING  )  AS emp_id
,CAST( 'CodeBoy'    AS STRING  )  AS emp_name
FROM emp_info
/*SQL*/;

这里举的数据修改例子都很简单,并且这里特意比临时表方法多了一个步骤,意在表达方法很多,可以按实际情况选择。

小结

以上通过表覆盖、临时表、临时分区的方法列举了如何在 Hive 中实现数据修改更新操作,可以根据实际需求场景进行开发和测试,并且要多思考,多总结,比如从这个小例子可以总结出:一条路不通可以迂回一下,采用别的方式实现也是一种不错的解决思路。

以上,一切祝好!

相关推荐
鹿衔`18 小时前
Hadoop HDFS 核心机制与设计理念浅析文档
大数据·hadoop·hdfs
`林中水滴`18 小时前
数仓系列:一文读懂仓湖一体架构
数据仓库
Justice Young21 小时前
Sqoop复习笔记
hadoop·笔记·sqoop
大厂技术总监下海1 天前
从Hadoop MapReduce到Apache Spark:一场由“磁盘”到“内存”的速度与范式革命
大数据·hadoop·spark·开源
zgl_200537791 天前
ZGLanguage 解析SQL数据血缘 之 Python提取SQL表级血缘树信息
大数据·数据库·数据仓库·hive·hadoop·python·sql
Justice Young2 天前
Hive第四章:HIVE Operators and Functions
大数据·数据仓库·hive·hadoop
LF3_2 天前
hive,Relative path in absolute URI: ${system:user.name%7D 解决
数据仓库·hive·hadoop
德彪稳坐倒骑驴2 天前
Hive SQL常遗忘的命令
hive·hadoop·sql
Justice Young2 天前
Hive第六章:Hive Optimization and Miscellaneous
数据仓库·hive·hadoop
Justice Young2 天前
Hive第五章:Integeration with HBase
大数据·数据仓库·hive·hbase