Hive DML
1、插入数据
1.1. Loading files into tables
-- 加载本地数据到 hive 表
load data local inpath '/root/data/data' into table psn;--(/root/data/data 指的是本地 linux 目录)
-- 加载 hdfs 数据文件到 hive 表
load data inpath '/data/data' into table psn;--(/data/data 指的是 hdfs 的目录)
留神:
1、load 操作不会对数据做任何的转换批改操作
2、从本地 linux load 数据文件是复制文件的过程
3、从 hdfs load 数据文件是挪动文件的过程
4、load 操作也反对向分区表中 load 数据,只不过须要增加分区列的值
1.2. Insert
insert 形式运行 MR 程序,通过程序将数据输入到表目录!
在某些场景,必须应用 insert 形式来导入数据:
- 向分桶表插入数据
- 如果指定表中的数据,不是以纯文本模式存储,须要应用 insert 形式导入
语法:
insert into|overwrite table 表名 select xxx | values(),(),()
insert into: 向表中追加新的数据
insert overwrite:先清空表中所有的数据,再向表中增加新的数据
非凡状况:多插入模式 (从一张源表查问,向多个指标表插入)
from 源表
insert xxxx 指标表 select xxx
insert xxxx 指标表 select xxx
insert xxxx 指标表 select xxx
举例:from deptpart2
insert into table deptpart1 partition(area='huaxi') select deptno,dname,loc
insert into table deptpart1 partition(area='huaxinan') select deptno,dname,loc
从查问语句中获取数据插入某张表
语法:Standard syntax:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;
Hive extension (dynamic partition inserts):
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
– 留神:这种形式插入数据的时候须要事后创立好后果表
– 从表中查问数据插入后果表
INSERT OVERWRITE TABLE psn9 SELECT id,name FROM psn
– 从表中获取局部列插入到新表中
from psn
insert overwrite table psn9
select id,name
insert into table psn10
select id
1.3. location
在建表时,指定表的 location 为数据寄存的目录
1.4. import
不仅能够导入数据还能够顺便导入元数据 (表构造)。Import 只能导入 export 输入的内容!
IMPORT [[EXTERNAL] TABLE 表名 (新表或曾经存在的表) [PARTITION (part_column="value"[, ...])]]
FROM 'source_path'
[LOCATION 'import_target_path']
1. 如果向一个新表中导入数据,hive 会依据要导入表的元数据主动创立表
2. 如果向一个曾经存在的表导入数据,在导入之前会先检查表的构造和属性是否统一
只有在表的构造和属性统一时,才会执行导入
3. 不论表是否为空,要导入的分区必须是不存在的
import external table importtable1 from '/export1'
2、DML 之导出
2.1. insert
将一条 sql 运算的后果,插入到指定的门路
语法:insert overwrite [local] directory '/opt/module/datas/export/student'
row format xxxx
select * from student;
2.2. export
既能导出数据,还能够导出元数据 (表构造)!
export 会在 hdfs 的导出目录中,生成数据和元数据!导出的元数据是和 RDMS 无关!如果是分区表,能够抉择将分区表的局部分区进行导出!语法:export table 表名 [partiton( 分区信息) ] to 'hdfspath'