5.1 向管理表中装载数据
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
在上述例子中,如果分区目录不存在的话,会先创建分区目录。然后再将数据拷贝到该目录下.
如果目标表是非分区表,省略掉PARTITION
子句.
通常情况下指定的路径应该是一个目录,而不是独立的文件。
使用LOCAL
关键字表示数据从本地文件系统路径拷贝数据。省略掉LOCAL
表示从分布式文件系统中拷贝。
LOAD DATA LOCAL
拷贝本地数据文件到分布式文件系统上的目标位置
LOAD DATA
移动数据到目标位置
指定全路径具有良好的可读性。同样支持相对路径。在本地模式执行时,相对路径是指当前Hive CLI启动时用户的工作目录。对于分布式或者伪分布式,该路径相对于分布式文件系统中用户的根目录。
若指定了OVERWRITE
,目标文件中存在的数据将会被删除。否则仅仅将把新增的文件增加到目标文件夹中而不会删除之前的数据。
如果目标表是分区表,需要使用PARTITION
,且必须为每个分区的键指定一个值
5.2 通过查询语句向表中插入数据
关键字INSERT
允许通过查询语句向目标表中插入数据.
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
不使用OVERWRITE
或者使用INTO
替换OVERWRITE
的话,Hive将会以追加的方式写入数据而不会覆盖之前的内容。
动态分区插入
INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
混合使用动态和静态分区
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';
静态分区键必须出现在动态分区键之前。动态分区默认没有开启。默认以"严格"模式执行。该模式下要求至少有一列分区字段是静态的。
动态分区属性
hive.exec.dynamic.partition 默认false,设置成true表示开启动态分区功能
hive.exec.dynamic.partition.mode 默认strict 设置成nonstrict表示允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 默认100 每个mapper或reducer可创建的最大动态分区个数
hive.exec.max.dynamic.partitions 默认1000 一个动态分区创建语句可创建的最大动态分区个数
hive.exec.max.created.files 默认100000 全局可以创建的最大文件个数
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> set hive.exec.max.dynamic.partitions.pernode=1000;
5.3 单个查询语句中创建表并加载数据
CREATE TABLE ca_employees
AS SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
5.4 导出数据
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';