数据更新是一种常见的操作,然后数据仓库的概念一般要求的是数据是集成、稳定的。HIVE作为一种分布式环境下以HDFS为支撑的数据仓库,它同样更多的要求数据是不可变的。 然而现实很多任务中,往往需要对数据进行更新操作,经查,Hive自0.11版本之后就提供了更新操作。于是想着试验一下,看看HIVE更新的操作和性能。
按照网上办法进行设置.
hive.support.concurrency – true hive.enforce.bucketing – true (Not required as of Hive 2.0) hive.exec.dynamic.partition.mode – nonstrict hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager hive.compactor.initiator.on – true (for exactly one instance of the Thrift metastore service) hive.compactor.worker.threads – a positive
同样在建表后面添加: stored as orc TBLPROPERTIES('transactional'='true'); 以支持ACID的要求.
如以简单的表进行实验:(id int ,name string) , 随意导入几条数据,进行测试.
写入更新操作命令: update ** set name ='aaa' where id =1;
得到结果如下:
似乎这样操作,HIVE对UPDATE操作就非常好的。其实经过实验,发现HIVE的更新机制速度非常的慢,在一个仅仅为6行的数据测试,其花费时间也要180S,这种效率肯定是无法忍受的。猜测其原因可能需要读出原有的表,进行更新,然后再写回HDFS?仅仅是猜测而已。 另外一个非常头疼的事情是,这种HIVE环境下支持ACID的表,竟然只能在HIVE内部才能访问到,而在BEELINE或者SPARK环境下,居然是无法获得数据的。或者对外不提供接口。(中间那行居然不显示数据!!!!)