目前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;