Hive RLIKE on a JOIN synthax



我在hive上有两个表。第一个称为"访问",包含apache日志,其中第一个字段是完整的ip地址:

10.4.5.12 - - [26/Jun/2010:11:16:09 +1000] "GET /myportal/pageA HTTP/1.1"
10.4.41.2 - - [26/Jun/2010:11:18:09 +1000] "GET /myportal/pageB HTTP/1.1"
10.5.1.111 - - [26/Jun/2010:11:22:09 +1000] "GET /myportal/pageA HTTP/1.1"
192.10.4.177 - - [26/Jun/2010:11:22:41 +1000] "GET /myportal/pageC HTTP/1.1"

另一个名为"客户端",包含ip范围的开头和字符串:

10.4 clientA
10.5 clientB
10.7 ClientC

我想找到点击总数,按客户,并显示他们的名字。所以,我试着这样把这两个表连接起来:

SELECT client.name,count(access.ip)FROM access JOIN client WHEREaccess.ip RLIKE client.ip GROUP BY client.name;

它是有效的,但对于客户端a,我的apache日志的最后一个条目(192.10.4.177)也受到了攻击,这是我不想要的。我只想将client.ip与access.ip.的开头进行比较

我想一个特定的正则表达式。。。或者我的synthax是错的。。。有人能有个主意吗?

提前感谢

RLIKE使用Java正则表达式。所以你可以用"^"来表示从某件事开始。例如,可以使用'CONCAT("^",client.ip)'将"^"放在client.ip之前。
SELECT client.name, count(access.ip)
FROM access JOIN client
WHERE access.ip RLIKE CONCAT("^",client.ip)
GROUP BY client.name;

然而,由于"."也是正则表达式中的一个特殊字符,表示任何字符。因此,上述解决方案并不完美。例如,如果客户端ip是1.3,它可能匹配"103.2.3.4"。因此,更好的解决方案是转义客户端ip中的"."。这是最终的解决方案:

SELECT client.name, count(access.ip)
FROM access JOIN client
WHERE access.ip RLIKE CONCAT("^",REGEXP_REPLACE(client.ip, "\.", "\."))
GROUP BY client.name;

第一个\.表示正则表达式.(我们需要在Hive中添加"\"来指定"\")。第二CCD_ 5表示字符串CCD_。如果您不熟悉Java正则表达式,它可能会让您感到困惑。

最新更新