第5章HiveQL:数据操作
5.1 装载表数据
装在数据:“大量”的数据装载操作;OR 将文件写入到正确的目录下。
例:
LOAD DATA LOCAL INPATH '{$env:HOME }/California-employees'
OVERWRITE INTO TABLE employees
PARTITION BY (country = 'US' ,state = 'CA');
-
若分区目录不存在,会自动创建,在拷贝数据到目录下;
-
非分区表需要省略PARTITION字句;
-
分区表需要使用PARTITION时,需要为每个分区的键指定一个值, PARTITION BY(键 = ‘值’),
例 PARTITION BY ( country = ‘US’ ,state = ‘CA’ )
-
LOCAL为本地文件系统—>HDFS,没有LOCAL则为分布式文件系统(HDFS)
-
LOAD DATA不能从HDFS集群A到集群B
-
全路径有更好的鲁棒性;相对路径在HIVE CLI中为启动时用户的工作目录;分布式or伪分布式为HDFS的根目录;
-
HIVE会验证文件格式与表结构定义是否一致
5.2 查询语句插入表数据
INSERT可以通过与查询语句SELECT结合向表中插入数据;
- INSERT OVERWRITE 覆盖之前的数据;INSERT INTO 追加新增数据;存在于HIVE v0.8.0以后
- 在表staged_employees中,使用不同的名字表示国家( cnty )和州( st )。
- 下面语句需要对全表扫描,当表很大且需要对K个州执行,则需要全表扫描K次;
INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state = ‘OR’)
SELECT * FROM staged_employees se
WHERE se.cnty = ‘US’ AND se.st = ‘OR’;
- 下面语句可改为对3个州做1次全表扫描;
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’
INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state = ‘IL’)
SELECT * WHERE se.cnty = ‘US’ AND se.st = ‘IL’
动态分区插入
- 一个分区在HDFS中代表着1个目录文件
- 动态分区需要配置以下参数
Hive> set hive.exec.dynamic.partition = true; //开启动态分区
Hive> set hive.exec.dynamic.partition.mode = nonstrict;//允许所有分区动态
Hive> set hive.exec.max.dynamic.partitions.pernode = 1000;// mapper和reducer可以创建的最大分区个数
其他参数
set hive.exec.max.dynamic.partitions = 1000; 语句可创建的最大动态分区数
set hive.exec.max.created.files = 100000; Hadoop全局可以创建的最大文件数
-
源表字段值和输出分区的关系是根据位置匹配的
-
静态分区键 必须在动态分区键前
INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state )//静态+动态
SELECT …, se.cnty ,se.st FROM staged_employees se
WHERE se.cnty = ‘US’
5.3 查询数据并装载 到新创建表
-
从一个大的宽表,选取需要的数据集
-
该功能不能用于外部表
CREATE TABLE ca_employees
AS SELECT name, salary, address FROM employees WHERE se.state = ‘CA’;
5.4 导出数据
- Hadoop -fs -cp A_PATH B_PATH//文件格式符合需求可直接复制
- INSERT … DIRECTORY …
INSERT OVERWRITE LOCAL **DIRECTORY** '/tmp/ca_employees'//相对路径
SELECT name, salary, address FROM employees
WHERE se.state = ‘CA’;
- 被写入的文件个数取决于调用的reducer 的个数
- HIVE会将字段序列化成字符串写入到文件中
- 被写入的文件个数取决于调用的reducer 的个数
- HIVE会将字段序列化成字符串写入到文件中
- 使用
ls/ tmp/ca_employees
查看文件是否存在; - 使用
cat /tmp/ca_employees/a_0
查看文件a_0的内容