You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hive.apache.org by "Qiang.Kang (Jira)" <ji...@apache.org> on 2019/10/05 05:28:00 UTC
[jira] [Created] (HIVE-22294) ConditionalWork cannot be cast to
MapredWork When both skew.join and auto.convert is on.
Qiang.Kang created HIVE-22294:
---------------------------------
Summary: ConditionalWork cannot be cast to MapredWork When both skew.join and auto.convert is on.
Key: HIVE-22294
URL: https://issues.apache.org/jira/browse/HIVE-22294
Project: Hive
Issue Type: Bug
Components: Physical Optimizer
Affects Versions: 2.3.4, 3.1.1, 2.3.0
Reporter: Qiang.Kang
Our hive version is 1.2.1 which has merged some patches (including patches mentioned in https://issues.apache.org/jira/browse/HIVE-14557, https://issues.apache.org/jira/browse/HIVE-16155 ) .
My sql query string is like this:
```
set hive.auto.convert.join = true;
set hive.optimize.skewjoin=true;
SELECT a.*
FROM
a
JOIN b
ON a.id=b.id AND a.uid = b.uid
LEFT JOIN c
ON b.id=c.id AND b.uid=c.uid;
```
And we met some error:
FAILED: ClassCastException org.apache.hadoop.hive.ql.plan.ConditionalWork cannot be cast to org.apache.hadoop.hive.ql.plan.MapredWork
The main reason is that there is a conditional task (*MapJoin*) in the list tasks of another Conditional task (*SkewJoin*). Here is the code snippet where it throws this exception:
`org.apache.hadoop.hive.ql.optimizer.physical.MapJoinResolver:`
```java
public Object dispatch(Node nd, Stack<Node> stack, Object... nodeOutputs)
throws SemanticException {
Task<? extends Serializable> currTask = (Task<? extends Serializable>) nd;
// not map reduce task or not conditional task, just skip
if (currTask.isMapRedTask()) {
if (currTask instanceof ConditionalTask) {
// get the list of task
List<Task<? extends Serializable>> taskList = ((ConditionalTask) currTask).getListTasks();
for (Task<? extends Serializable> tsk : taskList) {
if (tsk.isMapRedTask()) {
// ATTENTION: tsk May be ConditionalTask !!!
this.processCurrentTask(tsk, ((ConditionalTask) currTask));
}
}
} else {
this.processCurrentTask(currTask, null);
}
}
return null;
}
private void processCurrentTask(Task<? extends Serializable> currTask,
ConditionalTask conditionalTask) throws SemanticException {
// get current mapred work and its local work
MapredWork mapredWork = (MapredWork) currTask.getWork(); // WRONG!!!!!!
MapredLocalWork localwork = mapredWork.getMapWork().getMapRedLocalWork();
```
Here is some detail Information about query plan:
*- set hive.auto.convert.join = true; set hive.optimize.skewjoin=false;*
```
Stage-1 is a root stage [a join b]
Stage-12 [map join]depends on stages: Stage-1 , consists of Stage-13, Stage-2
Stage-13 has a backup stage: Stage-2
Stage-11 depends on stages: Stage-13
Stage-8 depends on stages: Stage-2, Stage-11 , consists of Stage-5, Stage-4, Stage-6
Stage-5
Stage-0 depends on stages: Stage-5, Stage-4, Stage-7
Stage-14 depends on stages: Stage-0
Stage-3 depends on stages: Stage-14
Stage-4
Stage-6
Stage-7 depends on stages: Stage-6
Stage-2
```
*- set hive.auto.convert.join = false; set hive.optimize.skewjoin=true;*
```
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-12 depends on stages: Stage-1 , consists of Stage-13, Stage-2
Stage-13 [skew Join map local task]
Stage-11 depends on stages: Stage-13
Stage-2 depends on stages: Stage-11
Stage-8 depends on stages: Stage-2 , consists of Stage-5, Stage-4, Stage-6
Stage-5
Stage-0 depends on stages: Stage-5, Stage-4, Stage-7
Stage-14 depends on stages: Stage-0
Stage-3 depends on stages: Stage-14
Stage-4
Stage-6
Stage-7 depends on stages: Stage-6
```
--
This message was sent by Atlassian Jira
(v8.3.4#803005)