hive执行更新和删除操作

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版)

<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>
-- 建立非分区表并加载数据
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; 

在hdfs上可以看到这些分桶之后的文件但是文件直接查看会乱码,需要借助命令,参考https://orc.apache.org/docs/hive-ddl.html

To get information about an ORC file, use the orcfiledump command.

% hive --orcfiledump <path_to_file>

As of Hive 1.1, to display the data in the ORC file, use:

% hive --orcfiledump -d <path_to_file>

下面是遇到的两个问题,解决办法是修改配置文件支持事务,第二重新建表修改表的存储格式和添加表属性STORED AS ORC TBLPROPERTIES (‘transactional‘=‘true‘); 

Attempt to do update or delete using transaction manager that does not support these operations. 
 Attempt to do update or delete on table mydb.stu_p that does not use an AcidOutputFormat or is not bucketed

总结,如果需要使用hive那么需要在创建表的时候声明STORED AS ORC TBLPROPERTIES (‘transactional‘=‘true‘); ,我们使用的默认的TEXTFILE格式是不支持的,

ORC格式文件的数据也不是直接导入的,而是从已经有的额表中查询并插入的

参考博客:http://blog.csdn.net/wzy0623/article/details/51483674

时间: 2024-11-08 09:54:19

hive执行更新和删除操作的相关文章

Entity Framework 6 Recipes 2nd Edition(10-10)译 - &gt; 为TPH继承的插入、更新、删除操作映射到存储过程

10-10. 为TPH继承的插入.更新.删除操作映射到存储过程 问题 TPH继承模型,想把它的插入.修改.删除操作映射到存储过程 Solution 假设数据库有一个描述不同种类的产品表(Product )(见Figure 10-13). 而且为这个表的每种产品创建了创建了派生模型,这个模型如Figure 10-14. Figure 10-13. 一个含有鉴别列(ProductType)的产品表, 表的每行按该列的值划分不同的产品 Figure 10-14. TPH继承形式的模型 接下来把这个模型

ASP入门(二十三)- 数据库插入、更新和删除操作

我们这里介绍如何使用 Recordset 对象进行插入.更新和删除操作,顺便和 SQL 语句对比. 插入记录 AddNew 方法用于插入一条记录,首先打开一个记录集,并且这个记录具备可写特性,而后调用 AddNew 方法告诉 ADO 要插入一条记录,而后分别设置各个字段的值,最后调用 Update 方法将插入的记录生效. 还是直接看具体代码和注释吧(AddNew.asp),如下: <!--#include file="../include/conn.asp"--> <

MySQL数据库基础(六)——SQL插入、更新、删除操作

MySQL数据库基础(六)--SQL插入.更新.删除操作 一.插入数据 1.为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值. INSERT INTO table_name (column_list) VALUES (value_list); insert into `TSubject` (subjectID,subjectName,BookName,Publisher) values ('0004','英语','大学英语走遍美国','清华出版社')

mysql---级联更新和删除操作

我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 对于这种,我们有两种解决方法: 一,使用innodb表的外键约束 ALTER TABLE `score` ADD CONSTRAINT `student_ibfk1` FOREIGN KEY `sid`(`sid`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 这里CASCADE作用就是在父表记录更新或删除

Entity Framework学习三:查询、插入、更新和删除操作

1.LINQ过滤数据  var query = from person in context.People where person.FirstName.StartsWith("a") select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a")); 两种不同的写法,效果一样. 多条件组合查找 var query = from person in c

使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据

将数据存储在Amazon S3中可带来很多好处,包括规模.可靠性.成本效率等方面.最重要的是,你可以利用Amazon EMR中的Apache Spark,Hive和Presto之类的开源工具来处理和分析数据. 尽管这些工具功能强大,但是在处理需要进行增量数据处理以及记录级别插入,更新和删除场景时,仍然非常具有挑战. 与客户交谈时,我们发现有些场景需要处理对单条记录的增量更新,例如: 遵守数据隐私法规,在该法规中,用户选择忘记或更改应用程序对数据使用方式的协议. 使用流数据,当你必须要处理特定的数

执行简单的CQL操作

CQL是Cassandra Query Language的缩写,目前作为Cassandra默认并且主要的交互接口.CQL和SQL比较类似,主要的区别是Cassandra不支持join或子查询,除了支持通过Hive进行批处理分析.要说这个Cassandra以前的接口主要是Thrift API,这个没有用过,不做评价. 一.创建keyspace 作为对照,你可以把keyspace理解成一个SQL数据库实例,当然它们毕竟是不同的:Cassandra的keyspace是用来定义数据是如何在节点间复制的.

MongoDB 的创建、查询、更新、删除

MongoDB数据库中,创建.查询.更新.删除操作的对象是集合. 1.查看某个数据库中有哪些集合,在此之前需要使用数据库 C:\Windows\system32>mongo MongoDB shell version: 3.2.10 connecting to: test > db test > show dbs; chengdu 0.004GB first 0.000GB local 0.000GB > use first; switched to db first > s

SQL Server索引进阶:第十三级,插入,更新,删除

在第十级到十二级中,我们看了索引的内部结构,以及改变结构造成的影响.在本文中,继续查看Insert,update,delete和merge造成的影响.首先,我们单独看一下这四个命令. 插入INSERT 当向表中插入一行数据的时候,不管表是堆表还是聚集索引表,肯定会在表的索引中插入一个入口,过滤索引除外.这么做的时候,SQL Server使用索引键的值从根页到叶子层页,到达叶子层页之后,检查页的可用空间,如果有足够的空闲空间,新的入口就会被插入适当的位置. 最终,SQL Server可能会试图向一