Hadoop 连接synthax上的蜂巢RLIKE

Hadoop 连接synthax上的蜂巢RLIKE,hadoop,hive,rlike,Hadoop,Hive,Rlike,我在蜂箱上有两张桌子。第一个称为“access”,包含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

我在蜂箱上有两张桌子。第一个称为“access”,包含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
我想按客户查找点击总数,并显示其名称。因此,我尝试像这样连接这两个表:

从access连接客户端中选择client.name、count(access.ip) access.ip RLIKE client.ip按client.name分组

它可以工作,但是对于clientA,我的apache日志的最后一个条目(192.10.4.177)也被点击了,这是我不想要的。我只想比较client.ip和access.ip的开头

我想一个特殊的正则表达式。。。也许我的Syntax错了。。。有人能有个主意吗


提前感谢

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

对!!很好,谢谢。顺便说一句,CONCAT(和RLIKE)的使用与MySQL()相同。