专栏首页Hadoop数据仓库让Hive支持行级insert、update、delete

让Hive支持行级insert、update、delete

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/51483674

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文件中添加如下配置项

<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.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.compactor.worker.threads</name>
    <value>1</value>
</property>

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

说明:不能update分区键,否则会报以下错误: FAILED: SemanticException [Error 10292]: Updating values of partition columns is not supported

四、参考 https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete http://unmeshasreeveni.blogspot.in/2014/11/updatedeleteinsert-in-hive-0140.html https://www.mapr.com/blog/hive-transaction-feature-hive-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 将MySQL去重操作优化到极致之三弹连发(一):巧用索引与变量

            元旦假期收到阿里吴老师来电,被告知已将MySQL查重SQL优化到极致:100万原始数据,其中50万重复,把去重后的50万数据写入目标表只需要9秒...

    用户1148526
  • Kettle构建Hadoop ETL实践(四):建立ETL示例模型

    从本篇开始,介绍使用Kettle实现Hadoop数据仓库的ETL过程。我们会引入一个典型的订单业务场景作为示例,说明多维模型及其相关ETL技术在Kettle上的...

    用户1148526
  • 触类旁通Elasticsearch:关联

    ES本身不支持SQL数据库的join操作,在ES中定义关系的方法有对象类型、嵌套文档、父子关系和反规范化。

    用户1148526
  • 《Hive使用教程》--- 大数据系列

    1. Hive起源于Facebook,它使得针对Hadoop进行SQL查询成为可能,从而非程序员也可以方便地使用。Hive是基于Hadoop的一...

    用户3467126
  • 大数据学习系列之五 ----- Hive整合HBase图文详解

    Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-*.j...

    用户2292346
  • Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》

    将Mysql安装包上传到服务器上,然后解压压缩包,使用命令:unzip mysql-libs.zip

    梅花
  • Hadoop——Hive

    官方地址http://hive.apache.org/ 简单,容易上手提供了类似SQL查询语言HQL 为超大数据集设计的计算、存储拓展能力 统一的元数据管...

    羊羽shine
  • Hadoop技术(三)数据仓库工具Hive

    在这里可以回顾一下Hadoop的相关知识: 1.x job tracker 既管资源调度又管任务分配 2.x 分为ResourceManager(资源分配)...

    时间静止不是简史
  • HiveServer2用户名和密码认证

    解压之后将libjpam.s复制到/usr/local/service/hadoop/lib/native中

    shangwen_
  • Hadoop Hive Hbase Kylin 环境搭建

    # hadoop-env.sh 配置 export JAVA_HOME=`absolute path` # core-site.xml 配置 <conf...

    lpe234

扫码关注云+社区

领取腾讯云代金券