大数据开发:Hive DML操作入门

2021-06-17 18:09:48 浏览数 (1)

前面讲了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当中的。

0 人点赞