Hive 数据处理语言

在 Hive 中有多种修改数据的方法:

进 Export命令也可用(自Hive 0.8起)。

将文件加载到表中

Hive 在将数据加载到表中时不会进行任何转换。加载操作当前是纯复制/移动操作,可将数据文件移动到与 Hive 表相对应的位置。

Syntax
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)
Synopsis

Hive 3.0 之前的加载操作是纯复制/移动操作,可将数据文件移动到与 Hive 表相对应的位置。

Hive 3.0 及更高版本支持其他加载操作,因为 Hive 在内部将加载重写为 INSERT AS SELECT。

这种模式的示例:

CREATE TABLE tab1 (col1 int, col2 int) PARTITIONED BY (col3 int) STORED AS ORC;
LOAD DATA LOCAL INPATH 'filepath' INTO TABLE tab1;

在这里,缺少分区信息,否则将产生错误,但是,如果位于* filepath *的文件符合表模式,使得每一行以分区列结尾,则负载将被重写为 INSERT AS SELECT 作业。

未压缩的数据应如下所示:

(1,2,3),(2,3,4),(4,5,3)等。

Notes

通过查询将数据插入到 Hive 表中

可以使用 insert 子句将查询结果插入表中。

Syntax
Standard syntax:
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 extension (multiple inserts):
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 extension (dynamic partition inserts):
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;
Synopsis
Notes
动态分区插入

Version information

此信息反映了 Hive 0.12 中的情况;在 Hive 0.6 中添加了动态分区插入。

在动态分区插入中,用户可以提供部分分区规范,这意味着只需在 PARTITION 子句中指定分区列名称的列表。列值是可选的。如果给出了分区列的值,我们称其为静态分区,否则为动态分区。每个动态分区列在 select 语句中都有一个对应的 Importing 列。这意味着动态分区的创建取决于 Importing 列的值。动态分区列必须在 SELECT 语句的列中“最后指定”,并且必须与它们在 PARTITION()子句中出现的 Sequences 相同。从 Hive 3.0.0(HIVE-19083)开始,无需指定动态分区列。如果未指定,Hive 将自动生成分区规范。

默认情况下,在 Hive 0.9.0 之前禁用动态分区插入,并在 Hive 0.9.0及更高版本中默认启用。这些是动态分区插入的相关配置属性:

Configuration property Default Note
hive.exec.dynamic.partition true 需要设置为true以启用动态分区插入
hive.exec.dynamic.partition.mode strict strict模式下,用户必须至少指定一个静态分区,以防万一用户意外覆盖了所有分区;在nonstrict模式下,允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 每个 Map 器/还原器节点中允许创建的最大动态分区数
hive.exec.max.dynamic.partitions 1000 总共允许创建的最大动态分区数
hive.exec.max.created.files 100000 MapReduce 作业中所有 Map 器/还原器创建的 HDFS 文件的最大数量
hive.error.on.empty.partition false 如果动态分区插入生成空结果,是否引发异常
Example
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)动态创建。请注意,未使用该名称。在nonstrict模式下,也可以动态创建dt分区。

Additional Documentation

通过查询将数据写入文件系统

可以使用上面语法的一些细微变化将查询结果插入文件系统目录:

Syntax
Standard syntax:
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 extension (multiple inserts):
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)
Synopsis
Notes

从 SQL 向表中插入值

INSERT ... VALUES 语句可用于直接从 SQL 将数据插入表中。

Version Information

INSERT ... VALUES 从Hive 0.14开始可用。

Syntax
Standard Syntax:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

Where values_row is:
( value [, value ...] )
where a value is either null or any valid SQL literal
Synopsis
Examples
CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2))
  CLUSTERED BY (age) INTO 2 BUCKETS STORED AS ORC;

INSERT INTO TABLE students
  VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);

CREATE TABLE pageviews (userid VARCHAR(64), link STRING, came_from STRING)
  PARTITIONED BY (datestamp STRING) CLUSTERED BY (userid) INTO 256 BUCKETS STORED AS ORC;

INSERT INTO TABLE pageviews PARTITION (datestamp = '2014-09-23')
  VALUES ('jsmith', 'mail.com', 'sports.com'), ('jdoe', 'mail.com', null);

INSERT INTO TABLE pageviews PARTITION (datestamp)
  VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');

INSERT INTO TABLE pageviews
  VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');

Update

Version Information

Hive 0.14开始可以使用 UPDATE。

更新只能在支持 ACID 的表上执行。有关详情,请参见Hive Transactions

Syntax
Standard Syntax:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
Synopsis
Notes

Delete

Version Information

Hive 0.14开始可以使用 DELETE。

删除只能在支持 ACID 的表上执行。有关详情,请参见Hive Transactions

Syntax
Standard Syntax:
DELETE FROM tablename [WHERE expression]
Synopsis
Notes

Merge

Version Information

Hive 2.2开始可以使用 MERGE。

只能在支持 ACID 的表上执行合并。有关详情,请参见Hive Transactions

Syntax
Standard Syntax:
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>
Synopsis
Performance Note

如果 ON 子句使得源中的多行与目标中的一行匹配,则 SQL Standard 要求引发错误。该检查的计算量很大,并且可能会严重影响 MERGE 语句的整体运行时间。 hive.merge.cardinality.check = false 可能会被用来禁用该检查,后果自负。如果禁用了检查,但是该语句具有这种交叉联接的效果,则可能导致数据损坏。

Notes
Examples
首页