HiveSQL 数据加载和导出
HiveSQL对Hive的数据操作包括对内部表、外部表、分区表以及桶表的数据的导入以及导出。
装载数据到表中
Hive不提供行级数据的插入,更新以及删除操作,因此当创建一个新的表,往表中装载数据是以大量数据的装载实现的,也就是把数据文件装载到HDFS文件系统表对应的目录下。
Load data local inpath "root/file.txt" into table test_table;
- Load 命令将文件装载到Hive表对应的目录中。
- Local 指本地文件系统路径
- Load data local... 表示把文本文件系统的文件装载到Hive在HDFS文件系统的目录
- 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';
这个功能不能用到外部表。
导出数据
导出数据分成两种情况:
- 将表目录下的数据文件导出即可
hadoop fs -cp source_path target_path - 对于一些查询结果需要保存的时候,可以使用命令:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/employee'
SELECT name,salary, address
FROM employee em
WHERE em.state= 'US';
无论数据在数据源如何存储,HIVE都会将所有的字符段列化成字符串写到文件中。Hive使用和Hive内部存储的表相同的编码方式来生成输出文件。