当前位置: 首页 > article >正文

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

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

以上,一切祝好!


http://www.kler.cn/a/441562.html

相关文章:

  • 学到一些小知识关于Maven 与 logback 与 jpa 日志
  • 数学规划问题2 .有代码(非线性规划模型,最大最小化模型,多目标规划模型)
  • SQLLOADER小实验
  • Debian 上安装PHP
  • C# 网络协议第三方库Protobuf的使用
  • 开篇:吴恩达《机器学习》课程及免费旁听方法
  • “MODAS: 利用多组学数据关联研究探索玉米种质资源“
  • elasticsearch 版本
  • [机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
  • k8s集群安装keepalive+haproxy
  • M4Pro内核MacOS brew安装docker爬坑
  • 给新ubuntu电脑配置远程控制环境和c++版本的opencv环境
  • 如何运用 HTM?
  • 数据结构 ——前缀树查词典的实现
  • PHP和phpSpider如何应对反爬虫网站的IP封禁
  • python在纯文本程序里面藏一张图
  • 大数据第三次周赛
  • 2024年12月11日Github流行趋势
  • git 导出某段时间修改的文件 windows
  • 基于Spring Boot的无可购物网站系统
  • Go-FastDFS文件服务器一镜到底使用Docker安装
  • 包管理器NPM
  • 前端学习-JavaScript基本介绍(十九)
  • 四、CSS3
  • 本地储存和服务器储存区别
  • 计算机网络 | 2.物理层