让Hive支持行级insert、update、delete
首先:欢迎各位学习java和大数据的程序员朋友们加入Java交流学习群: 721506929群里提供免费的架构学习资料,直播讲解,讲师都是有着十几年阿里java开发经验的大牛,欢迎各位前来围观学习。
正文:
Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。
一、Hive具有ACID语义事务的使用场景
1. 流式接收数据。
许多用户使用诸如Apache Flume、Apache Storm或Apache Kafka这样的工具将流数据灌入Hadoop集群。当这些工具以每秒数百行的频率写入时,Hive也许只能每15分钟到1小时添加一个分区,因为过于频繁地添加分区很快就会使一个表中的分区数量难以维护。而且这些工具还可能向已存在的分区中写数据,但是这样将会产生脏读(可能读到查询开始时间点以后写入的数据),还在这些分区的所在目录中遗留大量小文件,进而给NameNode造成压力。在这个使用场景下,事务支持可以获得数据的一致性视图同时避免产生过多的文件。
2. 缓慢变化维。
在一个典型的星型模式数据仓库中,维度表随时间的变化很缓慢。例如,一个零售商开了一家新商店,需要将新店数据加到商店表,或者一个已有商店的营业面积或其它需要跟踪的特性改变了。这些改变会导致插入或修改个别记录。从0.14版本开始,Hive支持行级更新。
3. 数据重述。
有时发现数据集合有错误并需要更正。或者当前数据只是个近似值(如只有全部数据的90%,得到全部数据会滞后)。或者业务业务规则可能需要根据后续事务重述特定事务(打个比方,一个客户购买了一些商品后又购买了一个会员资格,此时可以享受折扣价格,包括先前购买的商品)。或者一个客户可能按照合同在终止了合作关系后要求删除他们的客户数据。从Hive 0.14开始,这些使用场景可以通过INSERT、UPDATE和DELETE支持。
二、配置Hive支持事务(Hive 2.0版)
1. 在hive-site.xml文件中添加如下配置项
hive.support.concurrency
true
hive.exec.dynamic.partition.mode
nonstrict
hive.txn.manager
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
hive.compactor.initiator.on
true
hive.compactor.worker.threads
1
2. 添加Hive元数据(使用mysql存储)
INSERT INTO NEXT_LOCK_ID VALUES(1);
INSERT INTO NEXT_COMPACTION_QUEUE_ID VALUES(1);
INSERT INTO NEXT_TXN_ID VALUES(1);
COMMIT;
说明:初始时这三个表没有数据,如果不添加数据,会报以下错误:
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager FAILED: Error in acquiring locks: Error communicating with the metastore
三、测试
1. 启动hadoop集群和mysql
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
~/mysql/bin/mysqld &
2. 建立测试表
use test;
create table t1(id int, name string)
clustered by (id) into 8 buckets
stored as orc TBLPROPERTIES ('transactional'='true');
说明:建表语句必须带有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,并且不能带有sorted by子句。
3. 测试insert、update、delete
insert into t1 values (1,'aaa');
insert into t1 values (2,'bbb');
update t1 set name='ccc' where id=1;
delete from t1 where id=2;
执行结果分别如图1-3所示。
图1
图2
图3
说明:不能修改bucket列的值,否则会报以下错误:
FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported. Column id.
4. 已有非ORC表的转换
-- 在本地文件/home/grid/a.txt中写入以下4行数据
1,张三,US,CA
2,李四,US,CB
3,王五,CA,BB
4,赵六,CA,BC
-- 建立非分区表并加载数据
CREATE TABLE t1 (id INT, name STRING, cty STRING, st STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1;
SELECT * FROM t1;
-- 建立外部分区事务表并加载数据
CREATE EXTERNAL TABLE t2 (id INT, name STRING) PARTITIONED BY (country STRING, state STRING)
CLUSTERED BY (id) INTO 8 BUCKETS
STORED AS ORC TBLPROPERTIES ('transactional'='true');
INSERT INTO T2 PARTITION (country, state) SELECT * FROM T1;
SELECT * FROM t2;
-- 修改数据
INSERT INTO TABLE t2 PARTITION (country, state) VALUES (5,'刘','DD','DD');
UPDATE t2 SET name='张' WHERE id=1;
DELETE FROM t2 WHERE name='李四';
SELECT * FROM t2;
修改前和修改后的数据分别如图4、图5所示。
图4
图5
最后:欢迎各位学习java和大数据的朋友们加入Java交流学习群: 721506929(我在群里等你哟~一起来学习吧)
点击链接加入群聊【java交流学习群】:https://jq.qq.com/?_wv=1027&k=5mH1lvO群内提供免费的架构资料还有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的免费直播讲解 可以进来一起学习交流哦~
转载于:https://blog.51cto.com/14224832/2390566
让Hive支持行级insert、update、delete相关推荐
- mysql删除语句事务_事务用来管理 insert,update,delete 语句
MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...
- linux mysql 事务_linux下mysql Insert update delete 事务 用户管理
linux下mysql Insert update delete 事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES ...
- SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)
SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...
- PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
原文: PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...
- mybatis配置insert/update/delete同一个模板
insert,update,delete标签只是一个模板,在操作时是以sql语句为核心的, 即在做增/删/改时,insert/update/delete便签可以通用, 但做查询时只能用 select ...
- 内容必须匹配 (cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|selec
元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update ...
- 数据操纵:SELECT, INSERT, UPDATE, DELETE
1 SELECT 句法 2 3 SELECT [STRAIGHT_JOIN] 4 [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 5 [ ...
- SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项
目录 写在文章前 关于更新语句 INSERT语句 UPDATE语句 DELETE语句 更新语句的通用注意事项 写在文章前 本文从SQL语句格式角度,谈一谈SQL更新语句的基本格式及其在Oracle中的 ...
- Create and Drop Database, Create, Alter and Drop Tables, Select, Insert, Update, Delete Commands
此文仅做自我学习记录用!!! Introduction (Descriptive) Content:- Creating and Maintaining Tables, Objectives, The ...
最新文章
- python可以处理哪些文件_python文件处理
- 关于manacher
- FIO工具测试延迟、带宽、IOPS
- kafka架构、亿级数据如何优化GC
- 关于 UTXO 的思考
- android 邮件分享链接,Android应用从通过电子邮件发送的链接打开
- 【Qt教程】1.5 - Qt5内存回收机制-对象树、窗口坐标系
- hadoop 动态添加节点datanode及tasktracker
- centos6.9终端命令
- axure 鼠标样式_Axure教程:简单开关按钮的实现
- BizTalk Server 2010 - 使用 WCF Service [ 中篇 ]
- 我国网络贸易组织新发展
- 如何用3D Max进行三维建模
- 最小Linux系统中如何实现开机自动运行程序(进程)
- MIMIC数据库数据提取教程-提取时间维度数据
- 现在转行学软件测试还有前景吗?最真实的数据告诉你答案
- 【Adrealm智库专栏】数字广告为何需要“去中心化”?
- 2014美国大学计算机科学专业排名,2014年美国大学计算机科学专业排名.doc
- 解决PCB焊盘堵,PCB通孔的方法(个人总结)
- 编译原理(第二版)张素琴 课后代码 A.2 C版本