【问题标题】:Hive inequality join using between operator使用操作符之间的 Hive 不等式连接
【发布时间】:2016-06-26 07:18:33
【问题描述】:

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

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

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

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

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

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

如果我将 B.last_runtime 替换为实际值,例如“20160310”,它可以正常工作...

有什么想法吗?提前致谢

【问题讨论】:

  • 如果将 B.last_runtime 替换为常量,则不再有连接条件,而是 A 上的“where”条件。

标签: sql hadoop join hive


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Hive 在 join 条件下不支持任何操作,如 >,<,<=,>=。可能是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 用于大型数据集,因此它仅首先支持相等条件。

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多