Hive 数据操作语言全面解析

Hive 数据操作语言全面解析

在 Hive 大数据处理框架中,数据操作语言(DML)提供了多种方式来操作和修改数据,包括数据的加载、插入、更新、删除以及合并等操作。本文将详细介绍 Hive 中各类数据操作语句的语法、用法、注意事项以及版本相关特性,帮助大家更好地掌握 Hive 数据操作的方方面面。

一、数据操作方式概述

在 Hive 中,可以通过以下几种主要方式对数据进行修改:

  • LOAD:用于将文件加载到表中。
  • INSERT:能够从查询结果插入数据到 Hive 表、从 SQL 直接插入值到表,还支持动态分区插入以及将查询结果插入到文件系统目录等多种形式。
  • UPDATE:对支持 ACID 的表进行更新操作(从 Hive 0.14 版本开始支持)。
  • DELETE:同样针对支持 ACID 的表执行删除行的操作(从 Hive 0.14 版本开始支持)。
  • MERGE:可以基于与源表的连接结果对目标表执行相应操作(从 Hive 2.2 版本开始支持)。
    另外,从 Hive 0.8 版本开始,还提供了 EXPORTIMPORT 命令用于数据的导出和导入操作。

二、将文件加载到表

(一)语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2...)]
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2...)] [INPUTFORMAT 'inputformat' SERDE 'serde']3.0 或更高版本)

(二)概述

在 Hive 3.0 之前,加载操作基本是纯复制/移动操作,将数据文件移动到对应 Hive 表的位置。filepath 可以是相对路径、绝对路径或者包含协议和(可选)授权的完整 URI。加载的目标可以是表或分区,如果是分区表,需指定所有分区列的值来明确具体分区。filepath 可以指向一个文件或者一个目录,都会将对应文件移动到表中。

若指定 LOCAL 关键字:

  • 加载命令会在本地文件系统查找 filepath,相对路径会相对于用户当前工作目录解释,也可指定本地文件的完整 URI。
  • 命令会尝试将 filepath 指向的文件复制到目标文件系统(通过表的位置属性推断),然后再移动到表中。注意,若针对 HiveServer2 实例运行此命令,本地路径指的是 HiveServer2 实例上的路径,且 HiveServer2 需有访问该文件的权限。

若未指定 LOCAL 关键字:

  • filepath 未指定协议或授权,Hive 会使用 fs.default.name 配置变量中的信息(指定 NameNode URI)。若路径不是绝对路径,会相对于 /user/<username> 进行解释。
  • Hive 会将 filepath 指向的文件移动到表(或分区)中。使用 OVERWRITE 关键字时,会先删除目标表(或分区)原有的内容再替换,否则直接添加文件。

从 Hive 3.0 开始,支持更多加载操作,内部会将加载重写为 INSERT AS SELECT。若表有分区但加载命令没指定分区,会转换为 INSERT AS SELECT,并假设最后一组列是分区列,若文件不符合预期模式会报错。对于分桶表,在严格模式下会启动 INSERT AS SELECT 任务;在非严格模式下,若文件名符合命名规范则为纯复制/移动操作,否则启动 INSERT AS SELECT 任务。

(三)注意事项

  • filepath 在 Hive 3.0 之前一般不能包含子目录(3.0 及之后版本按上述描述可包含符合模式的子目录)。
  • 若未指定 LOCALfilepath 必须指向与表(或分区)位置相同文件系统内的文件。
  • Hive 会做一些基本检查确保加载的文件与目标表匹配,比如表存储为 sequencefile 格式时,加载的文件也需是该格式。
  • Hive 0.13.0 版本修复了文件名包含“+”字符时无法加载文件的问题。若数据文件是压缩的,需参考 CompressedStorage 相关内容。

三、从查询结果插入数据到 Hive 表(Inserting data into Hive Tables from queries)

(一)语法

  1. 标准语法
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2...)] select_statement1 FROM from_statement;
  1. Hive 扩展(多个插入)
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2...) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION... [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION...] select_statement2]...;
FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION...] select_statement2]
[INSERT OVERWRITE TABLE tablename2 [PARTITION... [IF NOT EXISTS]] select_statement2]...;
  1. Hive 扩展(动态分区插入)
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2]...) select_statement FROM from_statement;
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2]...) select_statement FROM from_statement;

(二)概述

  • INSERT OVERWRITE 会覆盖表或分区中已有的数据(从 Hive 0.9.0 开始,若为分区指定 IF NOT EXISTS 则不会覆盖)。从 Hive 2.3.0 开始,若表有 TBLPROPERTIES ("auto.purge"="true"),执行 INSERT OVERWRITE 时原数据不会移到回收站(仅适用于托管表,且该属性未设置或设置为 false 时不生效)。
  • INSERT INTO 会追加数据到表或分区,保留原有数据(INSERT INTO 语法从 0.8 版本开始可用)。
  • 从 Hive 0.13.0 起,可通过 TBLPROPERTIES ("immutable"="true") 创建不可变表(默认 false),对于已有数据的不可变表,INSERT INTO 操作不允许,表为空时 INSERT INTO 可用,INSERT OVERWRITE 不受此属性影响。
  • 插入操作可针对表或分区进行,若表是分区表,需指定分区列的值(从 Hive 0.12.0 起,若 hive.typecheck.on.insert 设置为 true,会对这些值进行验证、转换和规范化以符合列类型)。
  • 同一查询中可指定多个插入子句(多表插入),每个 select 语句的输出会写入对应的表(或分区),目前 OVERWRITE 关键字是强制的,表示用对应 select 语句的输出替换所选表或分区的内容,输出格式和序列化类由表的元数据确定。
  • 从 Hive 0.14 起,若表的 OutputFormat 实现了 AcidOutputFormat 且系统配置使用支持 ACID 的事务管理器,对该表禁用 INSERT OVERWRITE,可通过 TRUNCATE TABLE(非分区表)或 DROP PARTITIONINSERT INTO 实现类似功能。从 Hive 1.1.0 起,TABLE 关键字可选;从 Hive 1.2.0 起,INSERT INTO T 可指定列列表。从 Hive 3.1.0 起,不允许从含 UNION ALL 的源向全 CRUD ACID 表执行 INSERT OVERWRITE

(三)注意事项

  • 多表插入可减少数据扫描次数,Hive 通过一次扫描输入数据并应用不同查询操作,就能将数据插入多个表。
  • 从 Hive 0.13.0 起,select 语句可包含一个或多个公共表表达式(CTEs)。

四、动态分区插入

(一)版本信息及相关配置

动态分区插入在 Hive 0.6 版本添加,在 Hive 0.9.0 之前默认禁用,0.9.0 及之后默认启用。相关配置属性如下:

  • hive.exec.dynamic.partition:需设置为 true 来启用动态分区插入。
  • hive.exec.dynamic.partition.mode:在严格模式下,用户必须指定至少一个静态分区以防意外覆盖所有分区;非严格模式下允许所有分区都是动态分区。
  • hive.exec.max.dynamic.partitions.pernode:每个 mapper/reducer 节点允许创建的动态分区最大数量。
  • hive.exec.max.dynamic.partitions:总共允许创建的动态分区最大数量。
  • hive.exec.max.created.files:所有 mappers/reducers 在一个 MapReduce 任务中创建的 HDFS 文件最大数量。
  • hive.error.on.empty.partition:动态分区插入生成空结果时是否抛出异常。

(二)用法

用户可在 PARTITION 子句中给出部分分区规范,即只指定分区列名列表,列值可选(给定值为静态分区,未给定则为动态分区)。动态分区列在 SELECT 语句中的列顺序需与 PARTITION() 子句中出现的顺序一致且必须放在最后。从 Hive 3.0.0 起,若未指定动态分区列,Hive 会自动生成分区规范。

(三)示例

例如:

FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt

这里 country 分区将由 SELECT 子句的最后一列(即 pvs.cnt)动态创建,在非严格模式下 dt 分区也可动态创建。

五、将查询结果写入文件系统

(一)语法

  1. 标准语法
INSERT OVERWRITE [LOCAL] DIRECTORY directory1[ROW FORMAT row_format] [STORED AS file_format] (注意:从 Hive 0.11.0 版本开始可用)SELECT... FROM...
  1. Hive 扩展(多个插入)
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]...

其中 row_format 为:

DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char] (注意:从 Hive 0.13 版本开始可用)

(二)概述

directory 可以是完整的 URI,若未指定协议或授权,Hive 会使用 fs.default.name 配置变量中的信息。使用 LOCAL 关键字时,Hive 会将数据写入本地文件系统的目录。写入文件系统的数据按文本格式序列化,列默认用 ^A(\001)分隔,行用换行符分隔,若有非基本类型列,则这些列会序列化为 JSON 格式。

(三)注意事项

  • 在同一查询中,可同时使用插入到目录、本地目录以及表(或分区)的语句。
  • 向 HDFS 文件系统目录执行 INSERT OVERWRITE 语句是从 Hive 提取大量数据的最佳方式,Hive 可在 MapReduce 任务内并行写入 HDFS 目录。指定的目录若已存在,会被覆盖替换。
  • 从 Hive 0.11.0 起可指定分隔符,在更早版本固定为 ^A 字符,不过自定义分隔符在 Hive 0.11.0 到 1.1.0 版本仅支持本地写入,1.2.0 版本修复了此问题。
  • 在 Hive 0.14 中,向 ACID 合规表插入数据时,会在选择和插入期间停用矢量化,但仍可使用矢量化查询这些表。

六、从 SQL 直接插入值到表

(一)版本信息

INSERT...VALUES 语句从 Hive 0.14 版本开始可用。

(二)语法

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2]...)] VALUES values_row [, values_row...]
其中 values_row 为:( value [, value...] )value 可以是 null 或任何有效的 SQL 字面量

(三)概述

VALUES 子句中列出的每一行都会插入到指定表中,需为表的每一列提供值(目前不支持只插入部分列的标准 SQL 语法,不想赋值的列可填 null 模拟)。支持与 INSERT...SELECT 类似的动态分区方式,若插入的表支持 ACID 且使用支持 ACID 的事务管理器,操作成功完成后会自动提交。Hive 不支持复杂类型(数组、映射、结构体、联合)的字面量,所以不能在该语句中插入复杂类型列的数据。

(四)示例

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2))CLUSTERED BY (age) INTO 2 BUCKETS STORED AS ORC;INSERT INTO TABLE studentsVALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);

七、更新操作

(一)版本信息

UPDATE 操作从 Hive 0.14 版本开始可用,且只能在支持 ACID 的表上执行。

(二)语法

UPDATE tablename SET column = value [, column = value...] [WHERE expression]

(三)概述

被引用的列必须是要更新的表中的列,赋值的表达式需是 Hive 在 select 子句中支持的类型(如算术运算符、UDF、类型转换、字面量等,不支持子查询),只有匹配 WHERE 子句的行才会被更新,分区列和分桶列不能更新,操作成功完成后变化会自动提交。

(四)注意事项

更新操作会自动关闭矢量化,不影响非更新操作,更新后的表仍可使用矢量化进行查询。在 Hive 0.14 版本进行更新操作时,建议设置 hive.optimize.sort.dynamic.partition=false 以生成更高效的执行计划。

八、删除操作

(一)版本信息

DELETE 操作从 Hive 0.14 版本开始可用,同样只能在支持 ACID 的表上执行。

(二)语法

DELETE FROM tablename [WHERE expression]

(三)概述

只有匹配 WHERE 子句的行才会被删除,操作成功完成后变化会自动提交。

(四)注意事项

删除操作会自动关闭矢量化,不影响非删除操作,有删除数据的表仍可使用矢量化查询。在 Hive 0.14 版本做删除操作时,建议设置 hive.optimize.sort.dynamic.partition=false 以生成更高效的执行计划。

九、合并操作

(一)版本信息

MERGE 操作从 Hive 2.2 版本开始可用,也只能在支持 ACID 的表上执行。

(二)语法

MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <boolean expression1>
WHEN MATCHED [AND <boolean expression2

(三)概述

MERGE 允许基于与源表的连接结果对目标表执行相应操作。在 Hive 2.2 版本中,操作成功完成后更改会自动提交。

(四)性能注意事项

按照 SQL 标准,如果 ON 子句出现源表中多行匹配目标表中一行的情况,应该抛出错误。但这个检查计算成本较高,可能会显著影响 MERGE 语句的整体运行时间。可以通过设置 hive.merge.cardinality.check=false 来禁用此检查,但自行承担风险,若禁用检查且语句存在这种交叉连接效果,可能会导致数据损坏。

(五)注意事项

  • MERGE 语句中可以出现 1 个、2 个或 3 个 WHEN 子句,每种类型(UPDATE/DELETE/INSERT)最多只能有 1 个。
  • WHEN NOT MATCHED 必须是最后一个 WHEN 子句。
  • 如果同时存在 UPDATEDELETE 子句,语句中的第一个必须包含 [AND <boolean expression>]
  • 合并操作会自动关闭矢量化,不影响非合并操作,有数据变动的表仍可使用矢量化进行查询。

(六)示例

文中提到可查看对应示例出处了解具体的使用案例,但此处未给出详细示例内容呀,大家可以在实际使用中按照语法规则结合具体业务场景去尝试编写合适的 MERGE 语句进行测试和应用。

总之,Hive 的数据操作语言提供了丰富且功能强大的方式来处理数据,不过在使用各类操作语句时,需要特别留意版本要求、语法细节以及相应的注意事项,尤其是涉及到 ACID 特性相关的操作,这样才能确保数据操作的准确性以及高效性,满足大数据处理的业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS API日期对象

目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 实例化 目标&#xff1a;能够实现实例化日期对象 在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 创建一个时…

【前端】JavaScript中的闭包与垃圾回收机制详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;垃圾回收机制&#xff08;Garbage Collection, GC&#xff09;垃圾回收的核心原理核心过程 函数作用域与垃圾回收运行分析输出结果 垃圾回收的局限性与挑战 &#x1f4a…

单臂路由配置

知识点 单臂路由指在路由器上的一个接口配置子接口&#xff08;逻辑接口&#xff09;来实现不同vlan间通信 路由器上的每个物理接口都可以配置多个子接口&#xff08;逻辑接口&#xff09; 公司的财务部、技术部和业务部有多台计算机&#xff0c;它们使用一台二层交换机进行互…

verilog编程规范

verilog编程规范 文章目录 verilog编程规范前言一、代码划分二、verilog编码ABCDEFG 前言 高内聚&#xff0c;低耦合&#xff0c;干净清爽的代码 一、代码划分 高内聚&#xff1a; 一个功能一个模块干净的接口提取公共的代码 低耦合&#xff1a; 模块之间低耦合尽量用少量…

WEB安全基础知识

WAF全称为Web Application Firewall&#xff08;网页应用防火墙&#xff09;是一种专门设计用来保护web应用免受各种网络攻击的安全防护措施。它位于客户端与服务器之间&#xff0c;监控和过滤HTTP流量&#xff0c;从而拦截恶意请求、识别并防御常见的web攻击。 WAF的主要功能…

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …

前端怎么用 EventSource?EventSource 怎么配置请求头及加参数?EventSourcePolyfill 使用方法

前言 在前端开发中&#xff0c;特别是实时数据更新的场景下&#xff0c;EventSource 是一个非常实用的 API。它允许浏览器与服务器建立单向连接&#xff0c;服务器可以持续地发送数据给客户端&#xff0c;而无需客户端不断轮询。本文将详细介绍 EventSource 的使用方法、如何配…

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…

网页核心页面设计(第9章)

一、多个边框阴影 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

SpringBoot中Selenium详解

文章目录 SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖 2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件 三、使用示例四、总结 SpringBoot中Selenium详解 一、引言 在现代软件开发中&#xff0c;自动化测试是提高软件质量、减少重复…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

Fastapi教程:使用aioredis异步访问redis

本文将介绍如何使用 FastAPI 异步访问 Redis&#xff0c;包括环境配置、连接创建、数据库初始化、增删查改操作、键过期、管道&#xff08;pipeline&#xff09;操作以及事务管理等内容。 环境准备 首先&#xff0c;我们需要安装必要的依赖包。Redis 是一个键值存储系统&…

duxapp 2024-12-09 更新 PullView可以弹出到中间,优化CLI使用体验

UI库 修复 Button 禁用状态失效的问题Modal 组件即将停用&#xff0c;请使用 PullView 基础库 PullView side 新增 center 指定弹出到屏幕中间PullView 新增 duration 属性&#xff0c;指定动画时长新增 useBackHandler hook 用来阻止安卓端点击返回键 RN端 修复 windows …

多线程与线程互斥

目录 引言 一、多线程设计 多线程模拟抢票 二、互斥锁 互斥量的接口 修改抢票代码 锁的原理 锁的封装&#xff1a;RAII 引言 随着信息技术的飞速发展&#xff0c;计算机软件正变得越来越复杂&#xff0c;对性能和响应速度的要求也日益提高。在这样的背景下&#xff0c;…

Vue导出报表功能【动态表头+动态列】

安装依赖包 npm install -S file-saver npm install -S xlsx npm install -D script-loader创建export-excel.vue组件 代码内容如下&#xff08;以element-ui样式代码示例&#xff09;&#xff1a; <template><el-button type"primary" click"Expor…

ZUC256 Go Go Go!!!

文章目录 背景运行效果代码 背景 因业务需要使用ZUC算法&#xff0c;GitHub上又没有对ZUC256相对应的Go语言的实现。 吃水不忘挖井人&#xff0c;在这里感谢GmSSL及BouncyCastle两个强大的密码学库&#xff01; 本ZUC256的编写&#xff0c;参考了这两个库及中科院软件院发布的…

力扣打卡12:复原IP地址

链接&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 这道题需要对字符串进行操作&#xff0c;我选择了三层循环&#xff0c;其实还可以递归。 我在循环时进行了剪枝&#xff0c;比如一些情况直接跳出循环。 我的代码&#xff1a; class Solution { p…

The ‘.git/hooks/pre-push‘ hook was ignored because it‘s not set as executable.

Mac上使用Git提交代码提示&#xff1a; hint: The .git/hooks/prepare-commit-msg hook was ignored because its not set as executable. hint: You can disable this warning with git config advice.ignoredHook false. hint: The .git/hooks/commit-msg hook was ignored b…

【实践·专业课】内存管理-存储管理-文件系统

1. 基于Linux的简单区块链实现 1.1. 环境准备 确保使用的 Linux 系统&#xff08;如 Ubuntu、CentOS 等&#xff09;已安装 Python 3。 在终端输入python3命令&#xff0c;若出现 Python 解释器的版本信息等提示&#xff0c;则表示已安装&#xff1b; 若提示未找到命令&…

MySQL 学习 之 批量插入数据性能问题

文章目录 现象优化 现象 在使用 kettle 同步大数据的数据到我们的 MySQL 数据库中时发现&#xff0c;数据量大时插入效率很慢&#xff0c;大约在 2000/s 优化 在 MySQL 驱动连接中添加 rewriteBatchedStatementstrue 参数&#xff0c;减少 网络 IO DB IO 耗时 默认关闭指定…