您的位置:首页 > 新闻 > 热点要闻 > 产品设计用什么软件好_中邮保险网站_网站建设怎么弄_网站优化人员通常会将目标关键词放在网站首页中的

产品设计用什么软件好_中邮保险网站_网站建设怎么弄_网站优化人员通常会将目标关键词放在网站首页中的

2024/12/22 14:57:19 来源:https://blog.csdn.net/qq_68076599/article/details/144291341  浏览:    关键词:产品设计用什么软件好_中邮保险网站_网站建设怎么弄_网站优化人员通常会将目标关键词放在网站首页中的
产品设计用什么软件好_中邮保险网站_网站建设怎么弄_网站优化人员通常会将目标关键词放在网站首页中的

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 特性相关的操作,这样才能确保数据操作的准确性以及高效性,满足大数据处理的业务需求。

版权声明:

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

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