标签:manual 需要 eth json格式 http express bar form value
由 Confluence Administrator创建, 最终由 Lars Francke修改于 八月 15, 2018
原文链接
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
翻译:Google Google翻译,金山软件 金山词霸
校对:南大通用 范振勇 (2018.10.6)
在Hive中,有多种方式修改数据:
LOAD
INSERT
从查询到目标表
从查询到目录
成从SQL蜂巢表
UPDATE
DELETE
MERGE
从Hive0.8起可以使用EXPORT和IMPORT命令。
在将数据加载到表中时,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)
Hive3.0之前的加载操作是将数据文件移动(纯复制/移动操作)到与Hive表对应的位置。
从Hive 3.0开始,支持附加的Load操作,它在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下的(一个或多个)文件路径符合分区表模式,使得每行具有分配列(一个或多个)结束,则Load将改写成一个INSERT AS SELECT工作。
未压缩的数据应该是这样的:
(1,2,3),(2,3,4),(4,5,3)等等。
查询结果可以通过使用插入件子句插入到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;
在动态分区插入时,用户可以提供局部分区规范,这意味着只需在分区子句中指定分区列名列表,而列值是可选的。如果给出分区列值,我们将其称为静态分区,否则就是动态分区。每个动态分区列都有来自SELECT语句的相应的投影列。这意味着动态分区创建由输入列的值决定。动态分区列必须在SELECT语句中的投影列中最后指定,并按照它们在PARTITION()子句中出现的顺序。
在Hive3.0.0(hive-19083)中,不需要为动态分区指定分区列。如果未指定分区规范,Hive将自动生成该分区规范。
在Hive 0.9.0之前默认禁用动态分区插入,在Hive 0.9.0及更高版本中默认启用动态分区插入。下面是支持动态分区插入的相关配置属性:
配置属性 |
缺省值 |
注释 |
hive.exec.dynamic.partition |
true |
需要设置为true来启用动态分区插入 |
hive.exec.dynamic.partition.mode |
strict |
在strict模式下,用户必须指定至少一个静态分区的情况下,防止不小心将覆盖所有分区,在nonstrict模式下,允许所有分区是动态的。 |
hive.exec.max.dynamic.partitions.pernode |
100 |
允许在每个MAPPER/REDUCER节点创建动态分区的最大数目 |
hive.exec.max.dynamic.partitions |
1000 |
允许创建动态分区的最大数目 |
hive.exec.max.created.files |
100000
|
在MapReduce作业中所有MAPPER/REDUCER创建HDFS文件的最大数量 |
hive.error.on.empty.partition |
false
|
当动态分区插入产生空结果时,是否抛出一个异常 |
例:
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分区。
其他文档
将上述语法作细微变化,就可以将查询结果插入到文件系统目录中。
标准语法: 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)
在INSERT ... VALUES语句可以用来从SQL中将数据直接插入到表。
版本信息
自Hive0.14开始支持INSERT ... VALUES。
标准语法: INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...] 此处的values_row is: ( value [, value ...] ) 此处的value或者是NULL或者是任何有效的sql表达式。
译者注:我在Hive 2.3.3中验证上面第2条规则是不对的
drop table if exists test ; create table test(a int,b varchar(128)); insert into test (a,b) values (100,‘tianjin‘); insert into test (a) values (200),(300); insert into test values (400,‘beijing‘); select * from test ; 三条Insert into语句都是正确的,最后查询结果也是正确的 0: jdbc:hive2://hadoop15.gbase.cn:2181,hadoop> select * from test ; +---------+----------+ | test.a | test.b | +---------+----------+ | 100 | tianjin | | 200 | NULL | | 300 | NULL | | 400 | beijing | +---------+----------+
所以,在Hive 2.3.3中 Insert into 支持标准的SQL语句,可以直接插入部分列,其他列自动设置为NUL
例子
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‘);
版本信息
自Hive0.14开始,可以使用UPDATE。
UPDATE只能在支持ACID表上执行。详见Hive事务。
标准语法:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
版本信息
自Hive0.14开始,可以使用DELETE。
DELETE只能在支持ACID表上执行。详见Hive事务。
标准语法:
DELETE FROM tablename [WHERE expression]
版本信息
自Hive 2.2开始,可以使用MEGER。
MERGE只能在支持ACID表上执行。详见Hive事务。
标准语法: 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>
按SQL标准要求,如果ON子句是使得源中超过1行与目标中的1行匹配,就应该引发错误。此检查在计算上开销很大,可能会对合并语句的整个运行时产生显著影响。hive.merge.cardinality.check =false,可以禁用检查,这需要您自己承担风险。如果禁用检查是,但语句具有交叉连接效果,则可能导致数据损坏。
例子参见这里。
Hive 官方手册翻译 -- Hive DML(数据操纵语言)
标签:manual 需要 eth json格式 http express bar form value
原文地址:https://www.cnblogs.com/fanzhenyong/p/9749140.html