以下のHiveクエリを使用して、等価チェックに合格できません。
3つのテーブルがあり、これらのテーブルに参加したいと思います。私は以下のようにしようとしていますが、エラーが発生します:
失敗:セマンティック分析のエラー:行3:40 JOIN 'visit_date'で左と右の両方のエイリアスが見つかりました
select t1.*, t99.* from table1 t1 JOIN
(select v3.*, t3.* from table2 v3 JOIN table3 t3 ON
( v3.AS_upc= t3.upc_no AND v3.start_dt <= t3.visit_date AND v3.end_dt >= t3.visit_date AND v3.adv_price <= t3.comp_price ) ) t99 ON
(t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);
FuzzyTreeのヘルプに基づいて編集:
第一:
Between句とwhere句を使用して上記のクエリを編集しようとしましたが、クエリからの出力はありませんでした。
しかし、上記のクエリを日付付きのbetween句を削除して変更した場合、「v3.adv_price <= t3.comp_price」に基づいた出力が表示されますが、「日付フィルター」は使用されていません。
select t1.*, t99.* from table1 t1 JOIN
(select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no)
where v3.adv_price <= t3.comp_price
) t99 ON
(t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);
2番目:
次に、1つの日付のみを渡そうとしました:
select t1.*, t99.* from table1 t1 JOIN
(select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no)
where v3.adv_price <= t3.comp_price and v3.start_dt <= t3.visit_date
) t99 ON
(t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);
つまり、今は結果が表示されていますが、開始日と終了日の両方のフィルターを通過させると、結果が表示されます。結果は表示されません。
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+Joins
Hiveでは、等価結合、外部結合、および左準結合のみがサポートされています。マップ/リデュースジョブとしてそのような条件を表現することは非常に難しいため、Hiveは等価条件ではない結合条件をサポートしていません。
不等式をwhere
句に移動してみてください
select t1.*, t99.* from table1 t1 JOIN
(select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no)
where t3.visit_date between v3.start_dt and v3.end_dt
and v3.adv_price <= t3.comp_price
) t99 ON
(t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);