一 ,事务知识准备 :

1 ,从哪个版本开始支持事务 :

2 ,自动提交

3 ,必须是桶表

4 ,打开事务支持 :vim hive-site.xml

<!-- 支持高并发 -->
	<property>
	    <name>hive.support.concurrency</name>
	    <value>true</value>
	</property>
	<!-- 非严格模式 -->
	<property>
	    <name>hive.exec.dynamic.partition.mode</name>
	    <value>nonstrict</value>
	</property>
	<!-- 开启动态分区 -->
	<property>
	    <name>hive.exec.dynamic.partition</name>
	    <value>true</value>
	</property>
	<!-- 支持分桶 -->
	<property>
	    <name>hive.enforce.bucketing</name>
	    <value>true</value>
	</property>
	<!-- 支持事务 -->
	<property>
	    <name>hive.txn.manager</name>
	    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
	</property>
	<!-- 初始化器,管理一个分区的数据合并 -->
	<property>
	    <name>hive.compactor.initiator.on</name>
	    <value>true</value>
	</property>
	<!-- 每个 Metastore 中的 Worker 数量 -->
	<property>
	    <name>hive.compactor.worker.threads</name>
	    <value>1</value>
	</property>
	<!-- 只有在测试环境才能支持事务 -->
	<property>
		<name>hive.in.test</name>
		<value>true</value>
	</property>

5 ,修改配置文件后,重新启动 :

nohup hiveserver2 1>/dev/null 2>&1 &
beeline -u jdbc:hive2://node01:10000 -n root

6 ,严格模式 :

  1. 默认 :严格模式
  2. 严格模式 : 防止用户执行那些可能产生意想不到的不好的效果的查询。
    可以禁止 3 种类型的查询。
  3. 设置严格模式 :
    set hive.mapred.mode=strict;
  4. 禁止的三种类型 :
    1 ,分区表不能扫描全表 : 查询时,必须加分区字段,也就是不能查询所有数据。
    2 ,order by 必须与 limit 连用 :全表排序将会是一项巨大的工程,因此必须加以限制。
    3 ,限制笛卡尔积的查询 :必须 join on 连用,不可以 join - where 连用。

7 ,非严格模式 :

  1. 设置 :
    set hive.mapred.mode=nostrict;
  2. 效果 : 解除限制,啥都可以查。

8 ,静态分区 :

  1. 默认 :静态分区。
  2. 设置静态分区 :
    设置 :set hive.exec.dynamic.partition=false;
    查看设置 :set hive.exec.dynamic.partition;
  3. 分区的列 : 伪列,是不存在的字段。
  4. 不方便之处,在于 : 使用动态插入的时候不方便。
  5. 具体怎么不方便 : 一个表有分区,另一个表也有分区,那么,不可以直接插入数据。
  6. 为什么不能 : 因为,我们查询出来的分区值是一个字段,而另一个表中没有这个字段,所以插入不进去。
  7. 举个例子 :

1 ,a 表 :

create table a(id int,name string) partitioned by(dt string) 
row format delimited fields terminated by ',';

2 ,b 表 :( 两表字段一致,分区名字也一致 )

create table b(id int,name string) partitioned by(dt string) 
row format delimited fields terminated by ',';

3 ,a 表导入数据 : vim a.info

1,a
2,aa
3,aaa
4,aaaa

3 ,a 表导入数据 : vim b.info

5,b
6,bb
7,bbb
8,bbbb

3 ,a 表导入数据 :

load data local inpath '/root/hivetest/a.info' into table a partition(dt='1111');
load data local inpath '/root/hivetest/b.info' into table a partition(dt='2222');

4 ,查询 a 表数据 :

+-------+---------+-------+--+
| a.id  | a.name  | a.dt  |
+-------+---------+-------+--+
| 1     | a       | 1111  |
| 2     | aa      | 1111  |
| 3     | aaa     | 1111  |
| 4     | aaaa    | 1111  |
| 5     | b       | 2222  |
| 6     | bb      | 2222  |
| 7     | bbb     | 2222  |
| 8     | bbbb    | 2222  |
+-------+---------+-------+--+

5 ,把 a 表数据导入 b 表 : 报错

insert into b select * from a;

9 ,动态分区 : 剩下一个字段,那他就是分区字段

  1. 开启动态分区 :
    set hive.exec.dynamic.partition=true;
    set hive.exec.dynamic.partition.mode=nonstrict;
  2. sql
insert into b partition(dt) select * from a;
  1. 成功的标志 : b 表确实分区了
  2. 含义 :
    用 dt 分区,你不是剩下一个字段,没有填充进来吗,那你就是分区字段。

10 ,多个字段的,全自动态分区 :

insert overwrite table ds_parttion
 partition(state,ct)
 select id ,country,city from  mytest_tmp2_p;

11 ,多个字段的,半自动分区 :

  1. 含义 :某些字段手动指定分区,某些字段,自动分区。
  2. sql :
create table ds_parttion(id int) 
	partitioned by (state string ,ct string );
insert overwrite table ds_parttion
	partition(state='china',ct)  #state分区为静态,ct为动态分区,以查询的city字段为分区名
	select id ,city from  mytest_tmp2_p;

二 ,事务

1 ,开始版本 :

0.13 以后

2 ,支持行级别的 acid 操作 :

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

3 ,限制

  1. 自动提交 : 所有 DML 操作都是自动提交,尚不支持 BEGIN,COMMIT,和 ROLLBACK,
  2. 只支持 ORC 文件格式 :一种列式存储,产自 hive 。
  3. 必须分桶 : acid 操作的表必须分桶。
  4. 配置文件 :
    不允许从非ACID的会话中读取/写入ACID表。换句话说,要操作ACID表,必须将Hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager。
  5. 快照隔离 :
    现在只支持快照隔离级别。当一个给定的查询启动时,它会提供该数据的一致快照。不支持脏读(READ UNCIMMITTED)、提交读(READ COMMITTED)、可重复读(REPEATABLE READ)或可序列化(SERIALIZABLE)。引入BEGIN的目的是在事务持续时间内支持快照隔离,而不仅仅是一个查询。根据用户请求,还可以添加其他隔离级别。

4 ,例子 :

  1. 创建分桶表,orc 存储格式 :
create table tx(id int,name string,age int) 
clustered by (id) into 3 buckets 
row format delimited fields terminated by ',' stored as orc;
  1. 增 :
insert into tx values(1,'tom',23);
insert into tx values(2,'tom',23);
insert into tx values(3,'tom',23);
insert into tx values(4,'tom',23);
insert into tx values(5,'tom',23);
insert into tx values(6,'tom',23);