1 DML-Load加载数据
产生映射的方式:
- 将数据文件移到表对应文件夹下
- 建表时使用location关键字指定数据文件路径
- 官方推荐使用load命令将数据加载到表中,加载操作本质上是将数据文件移动到与Hive表对应的位置的纯复制/移动操作
-- 加载语法
-- 使用local关键字从本地文件系统(服务端)加载为纯复制,不使用则从hdfs上加载为移动
-- 使用overwrite关键字,则filepath中的内容会替代目标表/分区中的所有内容
-- 加载到表/分区(手动指定静态分区)
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-- 动态分区,将加载语句自动重写为insert as select,因此数据文件中最后一个字段变为虚拟的分区字段
-- 要求filepath中的数据文件最后一个字段作为动态分区字段
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
-- 配合inputformat使用
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
[INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)
2 DML-Insert插入数据
2.1 insert+select
INSERT INTO|OVERWRITE TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]]
select_statement1 FROM from_statement;
2.2 multiple inserts多重插入
一次扫描,多次插入。其功能就是减少扫描的次数
------------multiple inserts----------------------
-- 当前库下已有一张表student
select * from student;
--创建两张新表
create table student_insert1(sno int);
create table student_insert2(sname string);
-- 多重插入
from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;
2.3 dynamic partition insert动态分区插入
-- 动态分区插入
-- 1、首先设置动态分区模式为非严格模式 默认已经开启了动态分区功能
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
-- 2、当前库下已有一张表student
select * from student;
-- 3、创建分区表 以sdept作为分区字段
--注意:分区字段名不能和表中的字段名重复。
create table student_partition(Sno int,Sname string,Sex string,Sage int) partitioned by(Sdept string);
-- 4、执行动态分区插入操作
insert into table student_partition partition(Sdept) select Sno,Sname,Sex,Sage,Sdept from student;
2.4 insert + directory导出数据
-- 将select查询的结果导出成文件存放在文件系统中
-- 标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...
3 事务
3.1 介绍
-
hive作为数据仓库,是分析数据规律的,而不是创造数据规律的
-
Hive映射的数据通常存储于HDFS上,而HDFS是不支持随机修改文件数据
-
Hive0.14版本开始,具有ACID语义的事务(支持INSERT,UPDATE和 DELETE这些用例)
-
使用事务解决如下问题:
1)流式传输数据
2)变化缓慢的维度数据
3)数据更新
-
基本原理:
1)用HDFS文件作为原始数据(基础数据),用delta保存事务操作的记录增量数据;
2)正在执行中的事务,是以一个staging开头的文件夹维护的,执行结束就是delta文件夹。每次执行一次事务操作都会有这样的一个delta增量文件夹;
3)当访问Hive数据时,根据HDFS原始文件和delta增量文件做合并,查询最新的数据。
3.2 原理
-
INSERT语句会直接创建delta目录;
DELETE目录的前缀是delete_delta;
UPDATE语句采用了split-update特性,即先删除、后插入; -
每个事务的delta文件夹下都有两个文件:
1)事务版本号文件
2)包含数据内容的桶文件,该文件以orc格式存储
-
合并器:
1)随着表数据的修改,将越来越多的delta增量文件合并
2)将一个或多个增量文件和基础文件重写为新的基础文件
3.3 局限性
- 不支持BEGIN,COMMIT和ROLLBACK。所有语言操作都是自动提交的。
- 仅支持ORC文件格式(STORED AS ORC)。
- 默认情况下事务配置为关闭。需要配置参数开启使用。
- 表必须是分桶表(Bucketed)才可以使用事务功能。外部表无法创建事务表。
- 表参数transactional必须为true;
- 将hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
- 事务表不支持LOAD DATA …语句