我在 hive 里有两张table。第一个字段名为“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"
另一个名为“client”,包含ip范围的开头和字符串:
10.4 clientA
10.5 clientB
10.7 ClientC
我想找到总点击,按客户端,并显示他们的名字。我试着把这两个表连接起来:
选择client.name,count(access.ip)from access join client where access.ip rlike client.ip group by client.name;
它可以工作,但是对于clienta,我的apache日志的最后一个条目(192.10.4.177)也被命中了,这是我不想要的。我只想比较client.ip和access.ip的开头。
我想一个特殊的正则表达式。。。或者我的synthax错了。。。有人能想出办法吗?
提前谢谢
1条答案
按热度按时间n7taea2i1#
rlike使用java正则表达式。所以你可以用“^”来表示从某物开始。例如,可以使用“concat(“^”,client.ip)”将“^”放在
client.ip
.但是,由于“.”也是正则表达式中的一个特殊字符,因此表示任何字符。因此,上述解决方案并不完美。例如,如果客户端ip是
1.3
,它可以匹配“103.2.3.4”。因此,更好的解决方案是避开客户端ip中的“.”。以下是最终解决方案:第一个
\\.
表示正则表达式\.
(我们需要添加“\”以在配置单元中指定“\”。第二个\\.
表示字符串\.
. 如果您不熟悉java正则表达式,可能会使您感到困惑。