HOR RLIKE的JOIN语法

时间:2013-08-05 17:05:53

标签: hadoop hive rlike

我在蜂巢上有两张桌子。第一个称为“访问”,包含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。

我想一个特定的正则表达式......或者我的合成器可能是错的......有人有想法吗?

提前致谢

1 个答案:

答案 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正则表达式,可能会让您感到困惑。