我在蜂巢上有两张桌子。第一个称为“访问”,包含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"
和另一个名为'client',包含ip范围的开头和字符串:
10.4 clientA
10.5 clientB
10.7 ClientC
我想找到客户端的总点击数,并显示他们的名字。所以,我尝试加入这两个表:
SELECT client.name,count(access.ip)FROM访问JOIN客户端WHERE access.ip RLIKE client.ip GROUP BY client.name;
它可以工作,但对于clientA,我的apache日志的最后一个条目(192.10.4.177)也受到了打击,我不想要的。我想只在access.ip的开头比较client.ip。
我想一个特定的正则表达式......或者我的合成器可能是错的......有人有想法吗?
提前致谢
答案 0 :(得分:2)
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中指定“\”)。第二个\\.
表示字符串\.
。如果您不熟悉Java正则表达式,可能会让您感到困惑。