Улей 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"
и другой, называемый "клиент", который содержит начало диапазона ip и строку:
10.4 clientA
10.5 clientB
10.7 ClientC
Я хотел бы найти общее количество обращений по клиенту и отобразить их название. Итак, я пытаюсь объединить эти две таблицы следующим образом:
ВЫБЕРИТЕ client.name, count(access.ip) ОТ доступа Присоединиться к клиенту ГДЕ access.ip RLIKE client.ip GROUP BY client.name;
Это работает, но для клиента A я получаю удар по последней записи (192.10.4.177) в моем журнале apache, чего я не хочу. Я хотел бы сравнить client.ip только с начала access.ip.
Я предполагаю, что конкретное регулярное выражение... или, возможно, мой синтакс не так... может у кого-нибудь есть идея?
заранее спасибо
1 ответ
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, это может сбить вас с толку.