我有一个问题,Hive离开外部连接。
我在sql server中有一个al表。然后使用sqoop迁移配置单元上的所有表。
这是来自sql server的原始查询,其中包含非等左外部联接。两个表都有笛卡尔数据。
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;*
原始查询在SQLServer上提供1162条记录,但此配置单元查询提供46240条记录。我尝试了多种解决方法来获得相同的逻辑,但在hive上没有得到相同的结果。
你能在这方面帮助我确定这个问题,并让查询在具有相同结果集的配置单元上工作吗。
告诉我你还需要其他细节。
1条答案
按热度按时间deyfvvtc1#
配置单元不允许在on语句中使用<=或>=来比较表中的列。
以下是Hive手册的摘录:
版本2.2.0+:on子句中的复杂表达式
支持on子句中的复杂表达式,从hive 2.2.0开始(请参阅hive-15211、hive-15251)。在此之前,配置单元不支持非相等条件的连接条件。
特别是,联接条件的语法限制如下:
也可以将此视为另一种解决方案:在配置单元中使用非等左外部联接