装载数据:LOAD移动数据
原始数据被移动到目标表/分区,不再存在于原始位置
LOCAL:指定文件位于本地文件系统 ;OVERWRITE表示覆盖现有数据
使用方法:
LOAD DATA LOCAL INPATH '/home/dayongd/Downloads/employee.txt'
OVERWRITE INTO TABLE employee;
-- LOCAL表示文件位于本地,OVERWRITE表示覆盖现有数据
LOAD DATA LOCAL INPATH '/home/dayongd/Downloads/employee.txt'
OVERWRITE INTO TABLE employee_partitioned PARTITION (year=2014, month=12);
-- 没有LOCAL,文件位于HDFS文件系统中
LOAD DATA INPATH '/tmp/employee.txt'
OVERWRITE INTO TABLE employee_partitioned PARTITION (year=2017, month=12);
装载数据:INSERT表插入数据-1
- 使用INSERT语句将数据插入表/分区
- Hive支持从同一个表进行多次插入
- INSERT INTO中TABLE关键字是可选的
- INSERT INTO可以指定插入到哪些字段中
如:INSERT INTO t(x,y,z) - INSERT INTO table_name VALUES,支持插入值列表
- 数据插入必须与指定列数相同
-- INSERT支持OVERWRITE(覆盖)和INTO(追加)
INSERT OVERWRITE/INTO TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)]
select fileds,... from tb_other;
装载数据:INSERT表插入数据-2
INSERT OVERWRITE TABLE test select 'hello'; -- INSERT不支持的写法
insert into employee select * from ctas_employee; -- 通过查询语句插入
-- 多插入
from ctas_employee --高性能:只需扫描一次输入数据
insert overwrite table employee select *
insert overwrite table employee_internal select *;
-- 插入到分区
from ctas_patitioned
insert overwrite table employee PARTITION (year, month)--典型的ETL模式
select *,'2018','09';
-- 通过指定列插入(insert into可以省略table关键字)
insert into employee(name) select 'John' from test limit 1;--指定列有利于 data schema changes
-- 通过指定值插入
insert into employee(name) value('Judy'),('John');
Hive数据插入文件
- 使用insert语句将数据插入/导出到文件
- 文件插入只支持OVERWRITE
- 支持来自同一个数据源/表的多次插入
- LOCAL:写入本地文件系统
- 默认数据以TEXT格式写入,列由^A分隔
- 支持自定义分隔符导出文件为不同格式,CSV,JSON等
-- 从同一数据源插入本地文件,hdfs文件,表
from ctas_employee
insert overwrite local directory '/tmp/out1' select *
insert overwrite directory '/tmp/out1' select *
insert overwrite table employee_internal select *;
-- 以指定格式插入数据
insert overwrite directory '/tmp/out3'
row format delimited fields terminated by ','
select * from ctas_employee;
-- 其他方式从表获取文件
hdfs dfs -getmerge <table_file_path>
Hive数据交换 - IMPORT/EXPORT
- IMPORT和EXPORT用于数据导入和导出
- 常用于数据迁移场景
- 除数据库,可导入导出所有数据和元数据
- 使用EXPORT导出数据
EXPORT TABLE employee TO '/tmp/output3';
EXPORT TABLE employee_partitioned partition (year=2014, month=11) TO
- 使用IMPORT导入数据
IMPORT TABLE employee FROM '/tmp/output3';
IMPORT TABLE employee_partitioned partition (year=2014, month=11) FROM '/tmp/output5';