我们有一个类似于以下的查询:(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';



如果我将B.last_runtime替换为实际值,请说“20160310”,这样就可以了...

有任何想法吗?提前致谢

最佳答案

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;
}

关于sql - 配置单元之间使用 hive 不等式联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35933550/

10-16 01:29