如何配置hive支持行级数据更新操作?

Note
Hive 默认是不允许数据更新操作的,毕竟它不擅长,即使在0.14版本后,做一些额外的配置便可开启Hive数据更新操作。而在海量数据场景下做update、delete之类的行级数据操作时,效率并不如意。

基本环境:

Hive 1.2.1
hadoop 2.7.2

修改HIVE_HOME/conf/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>

建表

create table if not exists accountInfo(
id int,
name string,
age int
)
clustered by (id) into 4 buckets 
stored as orc TBLPROPERTIES ('transactional'='true');

建表须知

1 注意存储格式按ORC方式
2 进行数据分桶
3 添加表属性:‘transactional’=‘true’

分发配置到其他hive节点。

测试如下

插入测试数据
如何配置hive支持行级数据更新操作?_第1张图片
更新数据(此处配置了Hive on Tez)
如何配置hive支持行级数据更新操作?_第2张图片
数据删除
如何配置hive支持行级数据更新操作?_第3张图片

总结

hive作为数仓常用技术工具,更多的是用于数据的存储分析,而比较少涉及到数据更新。并且在OLAP场景下并不适合做原有数据更新,更不用说行级别的细粒度操作。记得在一些状态更新场景下会有缓慢渐变维的运用,可即使如此也要运用拉链表保存历史数据,很少将原有数据直接覆盖;你不知道被覆盖的数据蕴含着怎样的价值。

而在一些海量OLTP场景中,也会运用Hbase去替代传统RDB架构;若在运用中伴有大量的数据更新操作,我想Hbase会是不错的选择。

你可能感兴趣的:(#,hive)