HiveQL 数据操作

295 阅读2分钟

HiveSQL 数据加载和导出

HiveSQL对Hive的数据操作包括对内部表、外部表、分区表以及桶表的数据的导入以及导出。

装载数据到表中

Hive不提供行级数据的插入,更新以及删除操作,因此当创建一个新的表,往表中装载数据是以大量数据的装载实现的,也就是把数据文件装载到HDFS文件系统表对应的目录下。

Load data local inpath "root/file.txt" into table test_table;
  1. Load 命令将文件装载到Hive表对应的目录中。
  2. Local 指本地文件系统路径
  3. Load data local... 表示把文本文件系统的文件装载到Hive在HDFS文件系统的目录
  4. OVERWRITE关键字表示覆盖之前的文件内容,不加这个关键字,只会在原来的内容上进行追加

通过查询语句向表中插入数据

Insert语句允许用户通过查询语句向目标表中插入数据。

INSERT OVERWRITE TABLE employees
PARTITION(country='US', state='OR')
SELECT * from employees_tmp et
WHERE et.cnty='US' AND et.st='OR'

对于以上具有分区表的插入,加入数据很大,对于每一个分区表都要写一条插入语句,这样会显得很繁琐。比如下方,

FROM empleyees_tmo se
INSERT OVERWRITE TABLE employees
PARTITION(country='US', state='OR')
SELECT * WHERE et.cnty='US' AND et.st='OR'
PARTITION(country='US', state='CA')
SELECT * WHERE et.cnty='US' AND et.st='CA'
PARTITION(country='US', state='IL')
SELECT * WHERE et.cnty='US' AND et.st='IL'

对于上面分区很多的情况,可以在插入的时候通过动态分区的方法自动分区,将上面的命令改下为:

INSERT OVERWRITE TABLE employees
PARTITION(country, state)
SELECT ..., et.cnty, et.st
FROM employees_tmp et;

单个查询语句中创建并加载数据

CREATE TABLE employee_new
AS SELECT name, salary, address
FROM employee em
WHERE em.state = 'US';

这个功能不能用到外部表。

导出数据

导出数据分成两种情况:

  1. 将表目录下的数据文件导出即可 hadoop fs -cp source_path target_path
  2. 对于一些查询结果需要保存的时候,可以使用命令:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/employee'
SELECT name,salary, address
FROM employee em
WHERE em.state= 'US';

无论数据在数据源如何存储,HIVE都会将所有的字符段列化成字符串写到文件中。Hive使用和Hive内部存储的表相同的编码方式来生成输出文件。