11

我无法使用以下 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);

第二:

接下来我们尝试只传递一个日期:

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

所以,现在它显示了一些结果,但是如果我们同时通过了开始和结束日期过滤器,它;没有显示任何结果。

4

1 回答 1

31

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

Hive 仅支持等式连接、外连接和左半连接。Hive 不支持非相等条件的连接条件,因为很难将此类条件表示为 map/reduce 作业。

尝试将您的不等式移至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);
于 2014-09-15T14:49:03.813 回答