从Hive中的电子邮件地址中选择顶级域



我正在尝试在电子邮件address列中找到顶级域的长度。

我尝试了Regexp_replace的一些迭代,但没有成功。

失败的尝试都围绕以下命令:

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

预期输出:

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

您可以使用

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

[.]([^.]+)$ REGEX将匹配一个点,然后将1个或更多的字符捕获到输入末端的点以外的其他字符。1参数将使regexp_extract函数仅返回第1组中捕获的子字符串,而length将返回该值的长度。

,如果您可能在主机部件中没有dot的电子邮件,则可以进一步限制模式(以禁止在否定字符类中匹配@):

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

另一种方法。使用reversesplit'.',采用第一个数组元素,计算长度:

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)

最新更新