【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 小时前
Flink Stream API 源码走读 - print()
java·大数据·hadoop·flink·实时计算
君不见,青丝成雪4 小时前
hadoop技术栈(九)Hbase替代方案
大数据·hadoop·hbase
晴天彩虹雨4 小时前
存算分离与云原生:数据平台的新基石
大数据·hadoop·云原生·spark
yatingliu20195 小时前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
SelectDB技术团队8 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
程序员小羊!10 小时前
数据仓库&OLTP&OLAP&维度讲解
数据仓库
最初的↘那颗心11 小时前
Flink Stream API - 源码开发需求描述
java·大数据·hadoop·flink·实时计算
Lx35212 小时前
MapReduce作业调试技巧:从本地测试到集群运行
大数据·hadoop
BYSJMG12 小时前
计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】
大数据·hadoop·python·信息可视化·spark·django·课程设计
励志成为糕手12 小时前
大数据MapReduce架构:分布式计算的经典范式
大数据·hadoop·mapreduce·分布式计算·批处理