HiveQL:数据操作,装载和导出

装载数据

Hive 表装载数据使用 LOAD 命令

> LOAD DATA [LOCAL] INPAT '/localpath'
> INTO[OVERWRITE] TABLE employees
> [PARTITION (country='US', state='CA')];
  1. “LOCAL”关键字表示本地路径,否则为 HDFS 路径
  2. “OVERWRITE”表示删除表中已有数据,再添加新的数据。否则只是追加新的数据到表中。
  3. “PARTITION”表示数据添加的分区
  4. 数据会移动到表的存储目录下,由 Hive 管理

Hive 不会验证装载的数据格式是否匹配表的 Schema 定义,但是会验证文件格式是否为表定义的一致

通过查询插入数据

INSERT 语句允许通过查询语句将查询结果导入目标表。

> INSERT INTO[OVERWRITE] TABLE employees
> PARTITION(country='US', state='CA')
> SELECT * FROM staged_employee WHERE cnty='US' AND st='CA';

如果 staged_employee 数据量大,employees 分区数量多,需要对每个分区执行一次 INSERT 非常繁琐和耗时,Hive 提供另一种 INSERT 语法,只扫描一次数据,将结果按多种方式划分到指定分区:

> FROM staged_employee
> INSERT INTO[OVERWRITE] TABLE employees
>    PARTITION(country='US', state='CA')
>    SELECT * FROM staged_employee WHERE cnty='US' AND st='CA'
> INSERT INTO[OVERWRITE] TABLE employees
>    PARTITION(country='US', state='OR')
>    SELECT * FROM staged_employee WHERE cnty='US' AND st='OR'
> INSERT INTO[OVERWRITE] TABLE employees
>    PARTITION(country='US', state='IL')
>    SELECT * FROM staged_employee WHERE cnty='US' AND st='IL';

动态分区插入

上面的方法,如果分区很多,HQL 代码非常冗余,Hive 提供了动态分区功能,可以基于查询参数推断出要插入的分区名称。
如下所示,Hive 会根据最后两个字段的值,确定分区字段 country 和 state:

> INSERT INTO[OVERWRITE] TABLE employees
> PARTITION(country, state)
> SELECT ..., cnty, st
> FROM staged_employee;

静态分区和动态分区可以混合使用

> INSERT INTO[OVERWRITE] TABLE employees
> PARTITION(country='US', state)
> SELECT ..., cnty, st
> FROM staged_employee
> WHERE cnty='US';

country 为静态分区,state 为动态分区,静态分区字段必须在动态分区之前。

动态分区功能默认不开启。开启后,默认模式为“严格(strict)”,要求至少一列分区字段是静态的。

属性名称 缺省值 描述
hive.exec.dynamic.partition false 动态分区功能是否开启
hive.exec.dynamic.partition.mode strict 动态分区模式
strict,要求至少一列分区字段是静态的
nostrict,允许所有分区字段都是动态的
hive.exec.max.dynamic.partition.prenode 100 每个任务(Mapper / Reducer)可以创建的最大动态分区数
超过会抛出异常
hive.exec.max.dynamic.partition 1000 一个动态分区创建语句可以创建的最大动态分区数
超过会抛出异常
hive.exec.max.created.files 100000 全局可以创建的最大文件个数
超过会抛出异常

以上配置可以通过 SET 命令进行配置(针对当前数据库)

> SET hive.exec.dynamic.partition=true;
> SET hive.exec.dynamic.partition.mode=nostrict;
> SET hive.exec.max.dynamic.partition.prenode=1000;
...

查询结果创建表并导出

可以在一个语句中完成创建表并将查询结果载入表的操作,应用到 AS 语句

> CREATE TABLE ca_employee
> AS
> SELECT name, salary, address FROM employee
> WHERE state='CA';

此操作可以从一个大的表中选取部分数据(指定行、指定列)生成数据集。不能应用于外表

导出数据

如果数据存储格式是需要的格式,可以直接使用 HDFS 上的文件(根据表的存储位置查找)。

或者可以导出一个查询结果,到指定目录下

> INSERT INTO[OVERWRITE] [LOCAL] DIRECTORY '/local/path'
> SELECT name, salary, address FROM employees
> WHERE state='CA';

OVERWRITELOCAL 关键字与之前介绍的语义相同。生成的文件个数与 Reducer 数量(并行度)保持一致。

如何在 Hive 命令模式下,执行 Hadoop 命令(或其他本地命令),在命令前加 “!”

hive > ! ls /local/path
hive > ! cat /local/path/000000_0
hive > ! hadoop fs -ls /user/hive

References:
《Hive 编程指南》

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

8 − 2 =