我的表名为'records',其中包含desc:
hive> desc records;
OK
year string
temperature int
quality int
根据Apache documentation,可以在Hive 1.2.1中更新(0.14.0之后的版本a)
我尝试了更新命令并得到了下面提到的错误:
hive> update records
> set quality=8
> where year='2000';
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
我到底错过了什么? 它是代码还是表不符合任何条件(限制)?
答案 0 :(得分:1)
仅允许更新ORC文件格式。此外,您必须在执行更新或删除之前设置一些属性。
set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on=true;
set hive.compactor.worker.threads=1;
设置完成后,创建具有必需属性的表
CREATE TABLE test_result
(run_id VARCHAR(100), chnl_txt_map_key INT)
clustered by (run_id) into 1 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS orc tblproperties ("transactional"="true" );
现在您可以为此表执行更新或插入。如果您希望仅在adhoc基础上执行DML操作,则可以单独在会话中设置所有上述属性,而不是在hive-site.xml文件中设置服务器端属性。
答案 1 :(得分:0)
在hive-site.xml中添加以下属性
<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>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>1</value>
</property>
并重启hive服务器
检查此链接 - &gt; http://sanjivblogs.blogspot.in/2014/12/transactions-are-available-in-hive-014.html 希望这有帮助