前面讲了Hive DDL操作,基本上与SQL的基本操作类似,有相关的基础的话,理解掌握起来是非常快的。而DML部分,主要是涉及到增删改,也可以对比着来理解掌握。今天的大数据开发学习分享,就主要来讲讲Hive DML操作基础。
HQL DML 语法包括:
导入:Load file to table;
导出:Writing data into thie filesystem from queries;
插入:Inserting data into table from queries/ SQL;
更新:Update;
删除:Delete;
合并:Merge。
1、Load data
在将数据加载到表中时,Hive 不执行任何转换。Load 操作是纯复制/移动操作,仅将数据文件移动到与 Hive 表对应的位置。
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` `or later)
filepath 可以是绝对路径也可以是相对路径,也可以是一个 URI;
加载到目标可以是一个表或一个分区。如果是分区表,则必须制定所有分区列的值来确定加载特定分区;
filepath 可以是文件,也可以是目录;
制定 LOCAL 可以加载本地文件系统,否则默认为 HDFS;
如果使用了 OVERWRITE,则原内容将被删除;否则,将直接追加数据。
Hive 3.0 开始支持 Load 操作。
举例子:
CREATE TABLE tab1 (col1 ``int``, col2 ``int``) PARTITIONED BY (col3 ``int``) STORED AS ORC;
LOAD DATA LOCAL INPATH ``'filepath'` `INTO TABLE tab1;
2、Insert data
将查询数据插入到 Hive 表中。
-- 标准语法:
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;
-- 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] ...;
-- 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 将覆盖在表或分区的任何现有数据;
INSERT INTO将追加到表或分区,保留原有数据不变;
插入目标可以是一个表或分区。如果是分区表,则必须由设定所有分区列的值来指定表的特定分区;
可以在同一个查询中指定多个INSERT子句(也称为多表插入)。多表插入可使数据扫描所需的次数最小化。通过对输入数据只扫描一次(并应用不同的查询操作符),Hive可以将数据插入多个表中;
如果给出分区列值,我们将其称为静态分区,否则就是动态分区;
3、Export data
将查询数据写入到文件系统中。
-- 标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...
-- 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] (Note: Only available starting with Hive 0.13)
目录可以是一个完整的 URI;
使用 LOCAL,可以将数据写入到本地文件系统的目录上;
写入文件系统的数据被序列化为由 ^A 做列分割符,换行做行分隔符的文本。如果任何列都不是原始类型(而是 MAP、ARRAY、STRUCT、UNION),则这些列被序列化为 JSON 格式;
可以在同一查询中,INSERT OVERWRITE到目录,到本地目录和到表(或分区);
INSERT OVERWRITE 语句是 Hive 提取大量数据到 HDFS 文件目录的最佳方式。Hive 可以从 map-reduce 作业中的并行写入 HDFS 目录;
4、Insert values
直接从 SQL 将数据插入到表中。
--标准语法:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
-- 此处的values_row is:
-- ( value [, value ...] )
-- 此处的value或者是NULL或者是任何有效的sql表达式。
在 VALUES 子句中列出的每一行插入到表 tablename 中;
以 INSERT ... SELECT 同样的方式,来支持动态分区。
不支持 INSERT INTO VALUES 子句将数据插入复杂的数据类型(数组、映射、结构、联合)列中。
5、Update
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
被引用的列必须是被更新表中的列;
设置的值必须是 Hive Select 子句中支持的表达式。算术运算符,UDF,转换,文字等,是支持的,子查询是不支持的;
只有符合 WHERE 子句的行才会被更新;
分区列不能被更新;
分桶列不能被更新;
6、Delete
DELETE FROM tablename [WHERE expression]
只有符合WHERE子句的行会被删除。
7、Merge
-- 标准语法:
MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <boolean expression1>
WHEN MATCHED [AND <boolean expression2>] THEN UPDATE SET <set clause list>
WHEN MATCHED [AND <boolean expression3>] THEN DELETE
WHEN NOT MATCHED [AND <boolean expression4>] THEN INSERT VALUES<value list>
Merge 允许根据与源表 Join 的结果对目标表执行操作;
on 语句会对源与目标进行检查,此计算开销很大;
总的来说,Hive DML的操作逻辑,其实也与SQL一脉相承,本身有SQL的基础,是很容易迁移到HQL当中的。