² Data Manipulation
1. Loading Data into Managed Tables:
LOAD DATA [ LOCAL ] INPATH '${env:HOME}/california-employees'
[ OVERWRITE ] INTO TABLEemployees
PARTITION (country = 'US', state = 'CA');
--(hive不核实你加载的数据是否符合表的模式,但是核实文件是否匹配表的定义。For example, if the table was created with SEQUENCEFILE storage, the loaded files must be sequence files.)
ü 如果忽略LOCAL关键字,则移动分布式文件系统的数据到目的地,不省略则复制本地文件到目的地.
ü 只能在本filesystem集群使用 !!
ü 本地模式默认相对与用户的工作目录;对于伪分布式或分布式是相对于
/user/$USER
ü 如果指定OVERWRITE则先删除数据,再往里写;如果不指定,则是append.
ü 在文件路径上的使用限制, 这 INPATH子句的目标路径中不能包含任何目录或其他非文本文件(针对于存储格式为textfile来说)。
2. Inserting Data into Tables from Queries:
Ø INSERT[ OVERWRITE / INTO ]TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
ü OVERWRITE : 替换掉原来的数据(分区数据或整个不分区的表)
ü INTO : 附加到已有的表或分区后
Ø FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'CA')
SELECT * WHERE se.cnty = 'US' AND se.st = 'CA';
--(如果要插入的分区有多数个,那么hive会扫描staged_employees多数次,如果使用这个语法将会只扫描一次原表,在扫描过程中直接分裂为多数个ways)
ü 此语法中OVERWRITE 和 INTO 可以混用
ü 此语法中既可以用PARTITION表也可以是非分区的表,混用亦可
ü 此语法中目的表可以是不同的表
3. Dynamic Partition Inserts:
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> set hive.exec.max.dynamic.partitions.pernode=1000;
INSERT OVERWRITE TABLEemployees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
--(默认不开启动态插入功能,即使开启,默认也必须有静态的列,除非配置文件)
--(要实现此功能需)
ü PARTITION中没有值只有键,被视为动态分区插入,优势在于如果有大量分区要插入不需要一行一行的写每个分区
ü PARTITION中可以是动态分区与静态分区相结合,但是静态分区必须在动态分区之前
4. Creating Tables and Loading Them in One Query:
示例:
CREATE TABLE ca_employees
AS SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
Ø (相当于普通数据库中的视图,其中ca_employees中的列就是select中的列,主要用于创建子数据集)
Ø (但是不能用于创建external table)
5.exporting data:
FROM staged_employees se
INSERT OVERWRITE DIRECTORY '/tmp/or_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'OR'
INSERT OVERWRITE DIRECTORY '/tmp/ca_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'CA'
Ø (可以理解为把 table 替换为 DIRECTORY )
Ø (或者可用: hadoop fs -cp source_path target_path )