蜂巢酸更新和删除错误

Posted

技术标签:

【中文标题】蜂巢酸更新和删除错误【英文标题】:hive acid update and delete error 【发布时间】:2016-04-14 03:49:04 【问题描述】:

我用hive1.2.1和tez0.7做测试,但是当我用acid table做update和delete的时候,出现了一些问题,下面是表结构:

CREATE EXTERNAL TABLE IF NOT EXISTS working.dw_items_w
(
column defination
)
CLUSTERED BY (id) into 5000 buckets
STORED AS ORC
LOCATION '/sys/edw/working/dw_items_w2'
TBLPROPERTIES ("transactional"="true");

更新查询如下:

update working.dw_items_w
set 
PROCESS_FLAG =(case when (
(TGT_LSTG_STATUS_ID = 1 and (to_date(SALE_END) - to_date(TGT_AUCT_END_DT) ) <> 0 )
or  (TGT_LSTG_STATUS_ID in (1,2) and NEW_LSTG_STATUS_ID in (0,4) )   
) then  'D' 
when 
((TGT_LSTG_STATUS_ID =1 and NEW_LSTG_STATUS_ID = 1 and datediff(to_date(SALE_END) ,to_date(TGT_AUCT_END_DT) 
) = 0 )
or (TGT_LSTG_STATUS_ID = 2 and NEW_LSTG_STATUS_ID = 1)) then 'X' else PROCESS_FLAG end ),
NEW_LSTG_STATUS_ID = (case when TGT_LSTG_STATUS_ID = 0  AND NEW_LSTG_STATUS_ID = 0   AND to_date(SALE_END)
 <  date_sub(to_date( from_unixtime(unix_timestamp(),'yyyy-MM-dd') ), 92)
     AND to_date(SALE_END)  <> to_date('1969-12-31') then 1 else NEW_LSTG_STATUS_ID end) 

where PROCESS_FLAG = 'U';

问题如下:

在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:171) 在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:137) 在 org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:344) 在 org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:179) 在 org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:171) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1650) 在 org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:171) 在 org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:167) 在 org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException:Hive 运行时错误 处理行时(标签=0) "key":"reducesinkkey0":"transactionid":19,"bucketid":471,"rowid":0,"value":ignored 在 org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource.pushRecord(ReduceRecordSource.java:302) 在 org.apache.hadoop.hive.ql.exec.tez.ReduceRecordProcessor.run(ReduceRecordProcessor.java:249) 在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:148) ... 14 更多

【问题讨论】:

【参考方案1】:

将以下内容添加到 hive-site.xml

<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.compactor.worker.threads</name>
    <value>1</value>
</property>
<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>

然后确保您正在创建一个 ORC 表,并在 predict 上进行分桶:

如果不存在则创建表 foo.tableinfo ( 模式名称 varchar(32) , 表名 varchar(64) , 部门 varchar(64) , 国家 varchar(64) , 状态 varchar(64) , 城市 varchar(64) , 粒度 int , 注释 varchar(256) ) 由 (table_name) 聚集成 4 个桶 存储为兽人 TBLPROPERTIES ("orc.compress"="ZLIB", 'transactional'='true');

然后以下将起作用:

从 foo.tableinfo 中删除其中 table_name = 'foo';

【讨论】:

以上是关于蜂巢酸更新和删除错误的主要内容,如果未能解决你的问题,请参考以下文章

蜂巢错误:在蜂巢查询中指定字符串

当我在蜂巢中写入镶木地板表时出现 Pyspark 错误

使用酸态 - safeCopy 函数

蜂巢订单不工作

如何删除蜂巢列?

在火花中加入两个存在于蜂巢中的表