Hive 1.2.1的更新

时间:2016-11-18 12:30:31

标签: hadoop hive hiveql

我的表名为'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.

我到底错过了什么? 它是代码还是表不符合任何条件(限制)?

2 个答案:

答案 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;

服务器端(Metastore)

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 希望这有帮助