Hive 行级更新操作 -- 实现update和delete

本文详细介绍了在Hive中实现ACID事务的支持过程,包括必要的配置参数调整及表结构要求,解决update和delete操作失败的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在hive执行delete和update操作时,报错
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
操作代码:

hive> select * from tablename where id = 10000000;
Query ID = root_20190109131616_5a231979-1726-4bb3-9fb8-839dd8d082d4
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1545619490751_0354, Tracking URL = http://node00:8088/proxy/application_1545619490751_0354/
Kill Command = /opt/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/hadoop/bin/hadoop job  -kill job_1545619490751_0354
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2019-01-09 13:16:31,446 Stage-1 map = 0%,  reduce = 0%
2019-01-09 13:16:37,624 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 3.23 sec
MapReduce Total cumulative CPU time: 3 seconds 230 msec
Ended Job = job_1545619490751_0354
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1   Cumulative CPU: 3.23 sec   HDFS Read: 1284990 HDFS Write: 137 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 230 msec
OK
10000000	136****94	0	NULL	86	edfccfa84875884f158132ca1b889a15
Time taken: 17.549 seconds, Fetched: 1 row(s)
hive> update tablename set sex = 1 where id = 10000000;
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
hive> delete from tablename where id = 10000000;
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
hive> 

查询相关资料发现:
必须设置这些配置参数以打开Hive中的事务支持,见hive官网

Minimally, these configuration parameters must be set appropriately to turn on transaction support in Hive:

Client Side

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
Server Side (Metastore)

hive.compactor.initiator.on – true (See table below for more details)
hive.compactor.worker.threads – a positive number on at least one instance of the Thrift metastore service

修改CDH中Hive的配置文件hive-site.xml

  1. hive --> 配置 --> 搜索 hive-site
    在这里插入图片描述
  2. 服务端配置
    <property>
    	<name>hive.compactor.initiator.on</name>
    	<value>true</value>
    </property>
    <property>
    	<name>hive.compactor.worker.threads </name>
    	<value>1</value>
    </property>
    

在这里插入图片描述

  1. 客户端配置
    <property>
    	<name>hive.support.concurrency</name>
    	<value>true</value>
    </property>
    <property>
    	<name>hive.enforce.bucketing</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>
    

在这里插入图片描述

  1. 重启hive
    在这里插入图片描述

再次执行update和delete操作,依然报错。

hive> update ods_user set sex = 1 where id = 10000000;
FAILED: SemanticException [Error 10297]: Attempt to do update or delete on table hf_ods.ods_user that does not use an AcidOutputFormat or is not bucketed
hive> delete from ods_user  where id = 10000000;
FAILED: SemanticException [Error 10297]: Attempt to do update or delete on table hf_ods.ods_user that does not use an AcidOutputFormat or is not bucketed
hive> 

如果一个表要实现update和delete功能,该表就必须支持ACID,而支持ACID,就必须满足以下条件:

  1. 表的存储格式必须是ORC(STORED AS ORC);
  2. 表必须进行分桶(CLUSTERED BY (col_name, col_name, …) INTO num_buckets BUCKETS);
  3. Table property中参数transactional必须设定为True(tblproperties(‘transactional’=‘true’));

修改建表语句:

create table if not exists tablename (
  id bigint,
  sex tinyint  COMMENT '性别',
  name String COMMENT '姓名'
) COMMENT '用户表'
partitioned by (year string)
clustered by (id) into 2 buckets
row format delimited fields terminated by '\t'
stored as orc TBLPROPERTIES('transactional'='true');
<think>嗯,用户问的是Hive更新操作。首先我得回想Hive的基本特性。Hive主要是用于大数据处理的,基于Hadoop的数据仓库工具,它通常用来处理批量数据,所以传统上Hive是不支持事务的,也就是不支持ACID特性里的更新删除操作。不过可能用户在使用较新版本的Hive,比如Hive 0.14之后,因为从那个版本开始,Hive开始支持事务,允许更新删除。 接下来要考虑用户的具体情况。用户可能需要执更新操作,但可能不知道需要满足哪些条件。比如,Hive表需要是ACID兼容的,存储格式必须是ORC,而且表属性需要设置transactional=true。这时候需要详细说明这些前提条件,避免用户在没有配置的情况下尝试更新而失败。 然后,需要给出具体的更新语法,比如使用UPDATE语句,并举例说明。例如,如何更新一个员工表的部门字段。同时,可能需要提到MERGE INTO语句,这在Hive 2.2之后支持,可以处理更复杂的更新逻辑,比如根据条件合并数据。 用户可能遇到的问题包括表配置不正确,或者没有启用事务支持,还有性能方面的考虑,因为Hive更新操作可能不如传统关系型数据库高效,特别是在大数据量时。这时候需要提醒用户注意这些限制,并建议在小批量数据或必要时使用更新,或者考虑其他工具如HBase或Kudu。 另外,用户可能对Hive更新机制不太了解,需要解释背后的原理,比如使用事务管理器、增量文件压缩过程。这有助于用户理解为什么需要特定的配置存储格式。 最后,总结适用的场景限制,帮助用户判断是否适合使用Hive更新操作,或者是否需要其他解决方案。确保回答结构清晰,分步骤说明前提条件、语法、示例注意事项,这样用户能一步步理解操作。</think>Hive更新操作与传统关系型数据库有显著差异,以下是分步详解: 1. **Hive更新操作的前提条件** - 必须使用Hive 0.14及以上版本 - 表必须是ACID兼容表(Transactional Table) - 存储格式必须为ORC(Optimized Row Columnar) - 建表时需要设置表属性: ```sql CREATE TABLE employee ( id INT, name STRING, dept STRING ) STORED AS ORC TBLPROPERTIES (&#39;transactional&#39;=&#39;true&#39;); ``` 2. **更新操作语法** ```sql UPDATE table_name SET column = value [, column = value ...] [WHERE condition]; ``` 3. **具体示例** ```sql -- 将部门为&#39;Sales&#39;的员工改为&#39;Marketing&#39; UPDATE employee SET dept = &#39;Marketing&#39; WHERE dept = &#39;Sales&#39;; ``` 4. **MERGE INTO操作Hive 2.2+)** ```sql MERGE INTO target_table AS T USING source_table AS S ON T.id = S.id WHEN MATCHED AND S.dept = &#39;IT&#39; THEN UPDATE SET T.salary = S.salary * 1.1 WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (S.id, S.name, S.dept); ``` 5. **实现原理** - 通过事务管理器记录修改 - 使用增量文件(delta files)记录变更 - 定期执`COMPACT`操作合并文件 - 需要配置`hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager` 6. **注意事项** - 更新操作效率低于传统数据库,适合低频操作 - 每次更新会产生新的delta文件,需定期维护 - 必须启用Hive LLAP(Live Long and Process)或Tez执引擎 - 需要配置Hive元数据存储(Metastore)支持事务 7. **适用场景** - 缓慢变化维度(SCD)数据维护 - GDPR数据删除请求 - 数据修正(如ETL错误修复) - 需要ACID特性的实时分析场景 8. **性能优化建议** - 控制事务粒度:`SET hive.txn.max.open.batch=1000;` - 定期合
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值