Выберите домен верхнего уровня с адреса электронной почты в Hive - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь найти длину доменов верхнего уровня в столбце адреса электронной почты.

Я пробовал несколько итераций regexp_replace, но безуспешно.

Все неудачные попытки выполняются по следующей команде:

length(regexp_replace(emailaddress,'@\.(.*)',1)) --counts before '@' characters

Предполагаемый вывод:

emailaddress = asdfasdf@gmail.com
length = 3
emailaddress = asdfasdf@gmail.co
length = 2

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Еще один способ. Используйте reverse, split от '.', возьмите первый элемент массива, вычислите длину:

select length(split(reverse(emailaddress),'\\.')[0]);

Также regexp_extract работает нормально. Тестирование этих двух методов:

with data as (
select stack (2,
              'asdfasdf@gmail.com',
              'asdfasdf@gmail.co'
             ) as emailaddress
)

select emailaddress, 
       length(split(reverse(emailaddress),'\\.')[0])      length_method_1, 
       length(regexp_extract(emailaddress, '\\.(.+)$',1)) length_method_2 
  from data;

Результат:

OK
emailaddress    length_method_1 length_method_2
asdfasdf@gmail.com      3       3
asdfasdf@gmail.co       2       2
Time taken: 6.253 seconds, Fetched: 2 row(s)
0 голосов
/ 12 марта 2019

Вы можете использовать

length(regexp_extract(emailaddress,'[.]([^.]+)$', 1))

Регулярное выражение [.]([^.]+)$ будет соответствовать точке, а затем будет захватывать 1 или более символов, отличных от точки, до конца ввода. Аргумент 1 заставит функцию regexp_extract вернуть только подстроку, захваченную в группе 1, а length вернет длину этого значения.

В случае, если у вас могут быть электронные письма без точки в части хоста, вы можете ограничить шаблон еще больше (чтобы запретить сопоставление @ в классе отрицательных символов):

length(regexp_extract(emailaddress,'[.]([^@.]+)$', 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...