Sql 使用between算子的Hive不等式连接

Sql 使用between算子的Hive不等式连接,sql,hadoop,join,hive,Sql,Hadoop,Join,Hive,我们有一个类似下面的查询:(partition\u date是我们的表分区) 我们意识到,通过将条件放置在where子句中,它会导致一个完整的表扫描,因此我们需要将其作为上的放置在连接中 问题是Hive不支持不等式联接,因此我们考虑使用介于之间的运算符,如下所示: Select * from A JOIN B ON par_date between B.last_runtime and '99999999'; 这给了我们一个错误:遇到了左别名和右别名 在联接“9999999”中 如果我用实际值

我们有一个类似下面的查询:(partition\u date是我们的表分区)

我们意识到,通过将条件放置在
where
子句中,它会导致一个完整的表扫描,因此我们需要将其作为
上的
放置在
连接中

问题是Hive不支持不等式联接,因此我们考虑使用
介于
之间的运算符,如下所示:

Select * from A
JOIN B ON par_date between B.last_runtime and '99999999';
这给了我们一个错误:遇到了左别名和右别名 在联接“9999999”中

如果我用实际值替换B.last_runtime,比如说“20160310”,它可以正常工作


有什么想法吗?提前感谢

A在B和C之间
转换为A大于或等于B,A小于或等于C,所以我认为它仍然是一个非等联接

但是,我无法解释错误消息的含义。如果要分析源代码,则会抛出:

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

A在B和C之间
转换为A大于或等于B,A小于或等于C,所以我认为它仍然是一个非等联接

但是,我无法解释错误消息的含义。如果要分析源代码,则会抛出:

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

配置单元将不支持任何操作,如
配置单元将不支持任何操作,如
如果将B.last\u运行时替换为常数,则不再具有联接条件,而不是a上的“where”条件。如果将B.last\u运行时替换为常数,则不再具有联接条件,而不是“where”条件A。
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