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