Hive不支持update、delete解决方案

问题描述

HIVE在执行upddate 或 delete时报错:
Attempt to do update or delete using transaction manager that does not support these operations.
Attempt to do update or delete on table liuli.cars that does not use an AcidOutputFormat or is not bucketed.


Hive ACID

?要实现update和delete功能,该表就必须支持ACID,而支持ACID,就必须满足以下条件: 表的存储格式必须是ORC(STORED AS ORC);
?表必须进行分桶(CLUSTERED BY (col_name, col_name, …) INTO num_buckets BUCKETS);
Table property中参数transactional必须设定为True(tblproperties(‘transactional’=‘true’));

Hive使用update和delete中有两种常见报错

报错一:Attempt to do update or delete using transaction manager that does
not support these operations.

报错二:Attempt to do update or delete on table liuli.cars that does not
use an AcidOutputFormat or is not bucketed

报错一解决方案:配置hive-site.xml

服务端

hive-site.xml 的 Hive 服务高级配置代码段(安全阀)

hive.compactor.initiator.on – true

hive.compactor.worker.threads – 1

hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

客户端

hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)

hive.support.concurrency – true

hive.enforce.bucketing – true

hive.exec.dynamic.partition.mode – nonstrict

hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

报错二解决方案

字面意思是我的这个表不是AcidOutputFormat或bucketed格式,所以是表的问题。
通过sqoop导入的时候指定ORC格式的表并分个桶即可。

思考

?1、Hive可以通过修改参数达到修改和删除数据的效果,但是速度远远没有传统关系型数据库快
? 2、通过ORC的每个task只输出单个文件和自带索引的特性,以及数据的分桶操作,可以将要修改的数据锁定在一个很小的文件块,因此可以做到相对便捷的文件修改操作。因此数据的分桶操作非常重要,通常一些表单信息都会根据具体的表单id进行删除与修改,因此推荐使用表单ID作为分桶字段。
?3、频繁的update和delete操作已经违背了hive的初衷。不到万不得已的情况,还是使用增量添加的方式最好。
? 4、实际使用场景中hive数据默认为已经处理无误可用于分析的数据,通常使用全量或增量更新,对于可变更的数据通常存于oracle、mysql关系型数据库中。
? 5、因此hive最好搭配关系型数据库数据中心使用,数据中心更新好的数据通过sqoop等方式同步到hive。

参考:
https://blog.csdn.net/qq_39680564/article/details/101197852
https://blog.csdn.net/qq_39680564/article/details/101015864

————————————————
版权声明:本文为CSDN博主「one code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: https://blog.csdn.net/Wh1teMaster/article/details/108492291