前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive启用事务支持、数据更新

Hive启用事务支持、数据更新

原创
作者头像
esse LL
修改2024-03-31 18:39:04
1790
修改2024-03-31 18:39:04
举报
文章被收录于专栏:操作系统实验操作系统实验

1.准备数据

在本地新建数据文件:

代码语言:bash
复制
vi /tmp/stu.dat
代码语言:plaintext
复制
1,z3,11,Computer
2,z4,12,Math
3,z5,21,Computer
4,z6,31,Art

在Hive中建一个不分区的表,然后导入数据文件:

代码语言:sql
复制
CREATE TABLE student(
    sid INT, sname STRING, sage INT, sdept STRING
) 
ROW FORMAT DELIMITED FIELDS TERMINATED by ',';
代码语言:sql
复制
LOAD DATA LOCAL INPATH '/tmp/stu.dat' INTO TABLE student;

查询刚刚导入的数据:

代码语言:sql
复制
SELECT * FROM student;

2.建事务表

创建分区表,分区列是刚刚表中的最后一列sdept:

代码语言:sql
复制
CREATE EXTERNAL TABLE student_tx (sid INT, sname STRING,sage INT) 
PARTITIONED BY (sdept STRING)
CLUSTERED BY (sid) INTO 8 BUCKETS
STORED AS ORC 
TBLPROPERTIES ('transactional'='true');

分析:为了支持数据更新,表根据sid列的值分布到8桶,数据的存储格式是orc,表的属性值transactional设为true

3.导入数据

因为事务表不能使用load data...来加载数据,所以使用insert into...从刚刚的student表将数据加载到student_tx表

在数据导入到分区表的时候,可以设置动态分区从而简化操作:

代码语言:sql
复制
set hive.exec.dynamic.partition.mode=nonstrict;
代码语言:sql
复制
INSERT INTO student_tx PARTITION (sdept) SELECT * FROM student;

完成导入后查询分区:

代码语言:sql
复制
show partitions student_tx;

4.启用事务支持

修改配置文件:

代码语言:bash
复制
sudo vi /etc/hive/conf/hive-site.xml

71G使光标定位到71行,按o后加入以下配置项,然后:wq保存编辑结果:

代码语言:xml
复制
    <property>
        <name>hive.txn.manager</name>
        <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
    </property>
    <property>
        <name>hive.exec.dynamic.partition.mode</name>
        <value>nonstrict</value>
    </property>
    <property>
        <name>name>hive.enforce.bucketing</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.compactor.initiator.on</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.compactor.cleaner.on</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.compactor.worker.threads</name>
        <value>1</value>
    </property>

重启主机,使Hive进程重新启动

5.数据更新

尝试使用update语句更新数据记录,使年龄小于20的位置全部更新为(旧值+10得到的)新值:

代码语言:sql
复制
UPDATE student_tx SET sage=sage+10 WHERE sage<20;

完成更新后查询表:

代码语言:sql
复制
select * from student_tx;

参考效果:

尝试使用delete语句删除表中符合条件的记录

代码语言:sql
复制
DELETE FROM student_tx WHERE sname='z3';

完成删除后查询表:

代码语言:sql
复制
select * from student_tx;

参考效果:

补充练习:事务的原子性

重要:定义事务需要在高版本的Hive程序中运行

假设使用insert插入一些数据记录后,使用select查询进行分析,然后使用delete删掉这些数据,但是在删除的出错了

代码语言:sql
复制
start transaction;
-- 插入一些数据记录
insert into table student_tx partition (sdept) values (5,'tom',20,'computer');
insert into table student_tx partition (sdept) values (6,'t2',33,'art');
insert into table student_tx partition (sdept) values (7,'t3',34,'art');
insert into table student_tx partition (sdept) values (8,'t4',32,'math');
insert into table student_tx partition (sdept) values (9,'t5',33,'computer');
代码语言:sql
复制
-- 计算每个学生根据年龄在系部内的排名
select   
    sid, sname, sage, sdept, 
    rank() over (partition by sdept order by sage desc) as rank_within_dept,
    concat((percent_rank() over (partition by sdept order by sage desc)) * 100, '%') as percentile 
from student_tx  
order by sdept, rank_within_dept;
代码语言:sql
复制
delete from student_tx where sname = 't%'
代码语言:sql
复制
rollback; --回滚
代码语言:sql
复制
commit; -- 提交事务

查看最近的事务:

代码语言:sql
复制
show transactions;

参考:

https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.准备数据
  • 2.建事务表
  • 3.导入数据
  • 4.启用事务支持
  • 5.数据更新
  • 补充练习:事务的原子性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档