Hive不等式在运算符

时间:2016-03-11 06:20:02

标签: sql hadoop join hive

我们有类似下面的查询:(partition_date是我们的表分区)

SELECT * FROM A
JOIN B 
where partition_date > B.last_runtime;

我们意识到,通过将条件放在where子句中,它会导致全表扫描,因此我们需要将其作为JOIN放在ON中。

问题是Hive不支持不等式连接,所以考虑使用BETWEEN运算符,如下所示:

Select * from A
JOIN B ON par_date between B.last_runtime and '99999999';
  

这给了我们错误:遇到了左右别名   在加入' 99999999''

如果我用实际值替换B.last_runtime,请说' 20160310'它工作正常......

任何想法?提前致谢

2 个答案:

答案 0 :(得分:0)

A BETWEEN B AND C转换为 A大于或等于B AND A小于或等于C ,所以我认为它仍然是非等值的。

但是,我无法解释错误消息的含义。如果您想分析源代码,请抛出here

private static boolean hasTableAlias(JoinTypeCheckCtx ctx, String tabName, ASTNode expr)
    throws SemanticException {
  int tblAliasCnt = 0;
  for (RowResolver rr : ctx.getInputRRList()) {
    if (rr.hasTableAlias(tabName))
      tblAliasCnt++;
  }

  if (tblAliasCnt > 1) {
    throw new SemanticException(ErrorMsg.INVALID_JOIN_CONDITION_1.getMsg(expr));
  }

  return (tblAliasCnt == 1) ? true : false;
}

答案 1 :(得分:0)

在加入条件期间,Hive不支持><<=>=等任何操作。可能会leftright加入。这是一个例子:

select A.Name, A.Address, B.salary from Person_details as A left join Person_earnings as B on (B.salary > 15000) 

<强>代替

select A.Name, A.Address, B.salary from Person_details as A left join Person_earnings as B on (A.Id=B.Id) where B.salary > 15000
  

首先,应该进行相等操作,之后可以应用其他条件。由于Hive用于大型数据集,因此它首先仅支持相等条件。