hive-rlike在join synthax上

pkbketx9  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(424)

我在 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错了。。。有人能想出办法吗?
提前谢谢

n7taea2i

n7taea2i1#

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;

第一个 \\. 表示正则表达式 \. (我们需要添加“\”以在配置单元中指定“\”。第二个 \\. 表示字符串 \. . 如果您不熟悉java正则表达式,可能会使您感到困惑。

相关问题