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版)
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
-- 建立非分区表并加载数据 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 --orcfiledumpAs of Hive 1.1, to display the data in the ORC file, use: % hive --orcfiledump -d
下面是遇到的两个问题,解决办法是修改配置文件支持事务,第二重新建表修改表的存储格式和添加表属性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