【问题标题】:Query on Non Equi joins for Left outer join in Hive查询 Hive 中左外连接的非 Equi 连接
【发布时间】:2020-09-30 00:58:27
【问题描述】:

我正在尝试使用非 equi 连接条件在两个表之间进行左外连接,而 hive 不支持它。在 where 子句中添加条件会导致数据丢失。请让我知道是否有人有解决方案。以下是示例代码片段

Select B.dt ,D.field, sum(B.qty)
from A INNER join B ON A.dt= B.dt
INNER Join C ON B.nbr=C.nbr
LEFT OUTER JOIN D ON A.nbr2=D.Nbr2
AND B.nbr=D.nbr
---Below non equi join not supported
AND B.dt between C.start_date and C.End_Date 
-- Need suggestion of this non equi join.

以下是 hive 中非 equi 连接的错误:FAILED: SemanticException [Error 10017]: Line 9:4 在 JOIN 'START_DATE' 中遇到左右别名

【问题讨论】:

  • 我需要D的专栏我已经更新了hql

标签: sql join hive hql non-equi-join


【解决方案1】:

在您的情况下,有一种方法可以做到这一点。那是union all/window 函数方法。我认为这就是你想要的:

with t as (
      select a.nbr2, b.nbr, b.dt, null as end_date, null as field, b.qty
      from A join
           B
           on A.dt = B.dt
      union all
      select d.nrb2, d.nbr, d.start_date, d.end_date, d.field, null
      from D
    )
select dt, (case when dt < d_end_date then d_field end), sum(qty)
from (select t.*, 
             last_value(field, true) over (partition by nbr, nbr2 order by dt) as d_field,
             last_value(end_date, true) over (partition by nbr, nbr2 order by dt) as d_end_date
      from t
     ) t
group by dt, dt, (case when dt < d_end_date then d_field end);

我不能 100% 确定这完全一样——例如,这假设 D 中最多有一个匹配记录并且没有重叠。但想法是交错值并使用窗口函数作为last_value()ignore nulls 选项来获取正确的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多