蜂巢:非等分联接在蜂巢中不起作用

时间:2018-09-01 04:38:18

标签: hive

我在发出蜂巢左外连接问题。

我在sql-server中有一个表。然后使用sqoop迁移上的所有表 蜂巢。

这是来自sql-server的原始查询,其中包含非等号的LEFT 外加入。这两个表都有笛卡尔数据

SELECT
   vss.company_id,vss.shares_ship_id,vss.seatmap_cd,vss.cabin,vss.seat,
vss.seat_loc_dscr, vss.ep_seat AS EPlus_Seat, vss.ep_win_seat,
vss.ep_asle_seat, vss.ep_mid_seat, vss.em_win_seat,
   vss.em_mid_seat,vss.em_asle_seat,vss.y_win_seat, vss.y_mid_seat,
vss.y_asle_seat, vss.fj_win_seat, vss.fj_mid_seat,
vss.fj_asle_seat,vss.exit_row, vss.bulkhead_row, vss.eff_dt, vss.disc_dt
FROM rvsed11 zz
LEFT OUTER JOIN rvsed22 vss
   ON zz.company_id = vss.company_id
   AND zz.shares_ship_id = vss.shares_ship_id
   AND *zz.report_dt >= vss.eff_dt *
   AND *zz.report_dt < vss.disc_dt*;

As we know that Nonequi joins are not working in hive ( Nonequi joins
working in WHERE clause but we cannot use with LEFT OUTER JOIN).

See below hive query with noon-equi condition moved to where clause.

SELECT
   vss.company_id,vss.shares_ship_id,vss.seatmap_cd,vss.cabin,vss.seat,
vss.seat_loc_dscr, vss.ep_seat AS EPlus_Seat, vss.ep_win_seat,
vss.ep_asle_seat, vss.ep_mid_seat, vss.em_win_seat,
   vss.em_mid_seat,vss.em_asle_seat,vss.y_win_seat, vss.y_mid_seat,
vss.y_asle_seat, vss.fj_win_seat, vss.fj_mid_seat,
vss.fj_asle_seat,vss.exit_row, vss.bulkhead_row, vss.eff_dt, vss.disc_dt
FROM rvsed11 zz
LEFT OUTER JOIN rvsed22 vss
   ON zz.company_id = vss.company_id
   AND zz.shares_ship_id = vss.shares_ship_id

*WHERE zz.report_dt >= vss.eff_dt AND zz.report_dt < vss.disc_dt;*

原始查询在Sql-Server上给出了1162条记录,但是此配置单元查询 提供了46240条记录。 我尝试了多种解决方法以获取相同的逻辑,但未获得相同的结果 在蜂巢上。

您能在这方面帮助我确定问题并获得查询吗 在具有相同结果集的配置单元上。

让我知道您需要其他详细信息。

1 个答案:

答案 0 :(得分:0)

Hive不允许在ON语句中使用<=或> =来比较表中的列。

以下是Hive Manual的摘录:

版本2.2.0+:ON子句中的复杂表达式

从Hive 2.2.0开始,支持ON子句中的复杂表达式(请参阅HIVE-15211,HIVE-15251)。在此之前,Hive不支持不是相等条件的联接条件。

特别是,连接条件的语法受到如下限制:

join_condition:
    ON equality_expression ( AND equality_expression )*
equality_expression:
    expression = expression

也可以将其视为备用:Non equi Left outer join in hive workaround