zoukankan      html  css  js  c++  java
  • hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。

    假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含一个字段,uid。

     

    in查询

    如果要查询当天登陆的注册用户,需要用in查询,hive sql如下:

    select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is not null

    如果login表和regusers表按天分区,字段是dt,那么查询2013年1月1号当天登陆的注册用户,hive sql如下:

    select login.uid from login day_login left outer join 
       (select uid from regusers where dt='20130101') day_regusers
    on day_login.uid=day_regusers.uid where day_login.dt='20130101' and day_regusers.uid is not null

     

    not in查询

    如果要查询当天登陆的老用户(这里假设非当天注册用户就是老用户),需要用not in查询,hive sql如下:

    select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is null;

    如果login表和regusers表按天分区,字段是dt,那么查询2013年1月1号当天登陆的老用户,hive sql如下:

    select login.uid from login day_login left outer join 
       (select uid from regusers where dt='20130101') day_regusers
    on day_login.uid=day_regusers.uid where day_login.dt='20130101' and day_regusers.uid is null;

     


    LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。

    Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 

     

    ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

     

      SELECT a.key, a.value

      FROM a

      WHERE a.key in

       (SELECT b.key

        FROM B);

    可以被重写为:

       SELECT a.key, a.val

       FROM a LEFT SEMI JOIN b on (a.key = b.key)


    笛卡尔积

    Hive本身是不支持笛卡尔积的,不能用select T1.*, T2.* from table_1, table_2这种语法。但有时候确实需要用到笛卡尔积的时候,可以用下面的语法来实现同样的效果:

    select T1.*, T2.* from (select * from table1) T1 join (select * from table2) T2 on 1=1;

    其中on 1=1是可选的,注意在Hive的Strict模式下不能用这种语法,需要先用set hive.mapred.mode=nonstrict;设为非strict模式就可以用了。

  • 相关阅读:
    【应试】数据通信与网络
    【应试】操作系统OS
    【笔记】 卷积
    【HDU 5920】 Ugly Problem
    【笔记】位运算
    【洛谷P1378】油滴扩展
    【洛谷 P1120】 小木棍[数据加强版]
    [codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?
    [BZOJ]2563: 阿狸和桃子的游戏
    [BZOJ]4668: 冷战
  • 原文地址:https://www.cnblogs.com/charlist/p/7122136.html
Copyright © 2011-2022 走看看