2015-10-08 115 views
-4

我有一个名为“登录”的Hive表。它包含以下几列: -配置单元查询找到不存在的ip地址和国家

UserID | UserName | UserIP | UserCountry | Date 

在某一天(所有当天的登录),我想找出用户ID,它已经从一个国家(UserCountry)从用户具有访问从来没有从他们的帐户访问帐户以前从未访问过的IP(用户IP)。

+0

您使用的蜂巢或MySQL?这些是不同的数据库。 –

+0

我正在查找其中任何一个的查询。我相信查询不会有很大的不同。 – Pratyush

+0

@GordonLinoff,事实证明,“除外”条款不存在于配置单元中。因此,我正在寻找一个蜂巢查询。 – Pratyush

回答

1

我会继续启动,除非我删除之前的国家和IP

select userid, usercountry, userip 
from table 
where date=xx 
except 
select userid, usercountry, userip 
from table 
where date<xx 
+0

如果不使用“except”,你将如何做。 EXEPT子句在Hive中不存在。 – Pratyush

0

我认为最好的办法就是GROUP子句! 你说 “以前从未访问”,是指COUNT = 1

要查找IP只能使用一次:

select UserId, UserIP, COUNT(UserIP) FROM Login WHERE Date = yourdate GROUP BY UserIP, UserId HAVING COUNT(UserIP) = 1 

要找到国使用一次:

select UserId, UserCountry, COUNT(UserCountry) FROM Login WHERE Date = yourdate GROUP BY UserCountry, UserId HAVING COUNT(UserCountry) = 1 
+0

where子句将用Date <'您的日期'过滤掉所有行。因此,我们最终只会从“您的日期”开始处理数据集 – Pratyush

0

Left Outer Join将能够满足您的要求HIVE

select t1.userid, t1.usercountry, t1.userip 
from table t1 
LEFT OUTER JOIN 
from table t2 
ON (t1.userid=t2.userid) 
WHERE t1.date=xx and 
t2.data < xx and 
(t2.usercountry IS NULL or 
t2.userip IS NULL); 

希望这有助于...