连接表时Hive查询出错

时间:2014-09-13 08:07:06

标签: join hadoop hive hiveql cloudera-cdh

我无法使用下面的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子句编辑上述查询,但没有从查询中获取任何输出。

但是如果我们通过删除带有date的between子句来改变上面的查询,那么我得到了一些基于&#34; v3.adv_price&lt; = t3.comp_price&#34;的输出,但没有使用&#34; date过滤&#34 ;.

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

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

1 个答案:

答案 0 :(得分:29)

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

  

仅支持等同连接,外连接和左半连接   蜂巢。 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);
相关问题