Улей 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, это может сбить вас с толку.

Другие вопросы по тегам