欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【Hive 如何进行update更新?】

【Hive 如何进行update更新?】

2024/12/31 1:13:17 来源:https://blog.csdn.net/m0_47163275/article/details/144473241  浏览:    关键词:【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’。

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

2.临时表

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

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

--示例
--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_nameEND     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’)中,然后将临时分区数据修改更新后再重新插入正常分区中即可,临时分区较临时表的好处之一就是如果一张表有很多分区,仅操作某个分区比操作一张表的数据量较少。

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

以上,一切祝好!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com