在本地新建数据文件:
vi /tmp/stu.dat
1,z3,11,Computer
2,z4,12,Math
3,z5,21,Computer
4,z6,31,Art
在Hive中建一个不分区的表,然后导入数据文件:
CREATE TABLE student(
sid INT, sname STRING, sage INT, sdept STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED by ',';
LOAD DATA LOCAL INPATH '/tmp/stu.dat' INTO TABLE student;
查询刚刚导入的数据:
SELECT * FROM student;
创建分区表,分区列是刚刚表中的最后一列sdept:
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
因为事务表不能使用load data...来加载数据,所以使用insert into...从刚刚的student表将数据加载到student_tx表
在数据导入到分区表的时候,可以设置动态分区从而简化操作:
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO student_tx PARTITION (sdept) SELECT * FROM student;
完成导入后查询分区:
show partitions student_tx;
修改配置文件:
sudo vi /etc/hive/conf/hive-site.xml
按71G
使光标定位到71行,按o后加入以下配置项,然后:wq保存编辑结果:
<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进程重新启动
尝试使用update语句更新数据记录,使年龄小于20的位置全部更新为(旧值+10得到的)新值:
UPDATE student_tx SET sage=sage+10 WHERE sage<20;
完成更新后查询表:
select * from student_tx;
参考效果:
尝试使用delete语句删除表中符合条件的记录
DELETE FROM student_tx WHERE sname='z3';
完成删除后查询表:
select * from student_tx;
参考效果:
重要:定义事务需要在高版本的Hive程序中运行
假设使用insert插入一些数据记录后,使用select查询进行分析,然后使用delete删掉这些数据,但是在删除的出错了
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');
-- 计算每个学生根据年龄在系部内的排名
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;
delete from student_tx where sname = 't%'
rollback; --回滚
commit; -- 提交事务
查看最近的事务:
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 删除。