【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 中实现数据修改更新操作,可以根据实际需求场景进行开发和测试,并且要多思考,多总结,比如从这个小例子可以总结出:一条路不通可以迂回一下,采用别的方式实现也是一种不错的解决思路。

以上,一切祝好!

相关推荐
大鳥3 小时前
数据仓库知识体系
hive·hadoop
计算机毕业编程指导师4 小时前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
计算机毕业编程指导师4 小时前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放
talle20214 小时前
Hive | 行列转换
数据仓库·hive·hadoop
Gain_chance6 小时前
27-学习笔记尚硅谷数仓搭建-数据仓库DWD层介绍及其事务表(行为)相关概念
大数据·数据仓库·笔记·学习
talle20217 小时前
Hive | json数据处理
hive·hadoop·json
CTO Plus技术服务中7 小时前
Hive开发与运维教程
数据仓库·hive·hadoop
Gain_chance7 小时前
28-学习笔记尚硅谷数仓搭建-DWD层交易域加购事务事实表建表语句及详细分析
数据仓库·hive·笔记·学习·datagrip
小邓睡不饱耶7 小时前
Hive 实战:数据仓库建模、SQL 进阶与企业级案例
数据仓库·hive·sql
ha_lydms8 小时前
Hadoop 架构
大数据·hadoop·hdfs·架构·mapreduce·yarn·数据处理