如何在 Hive 中使用正则表达式简化 g-mail 地址
Posted
技术标签:
【中文标题】如何在 Hive 中使用正则表达式简化 g-mail 地址【英文标题】:How to simplify g-mail addresses using regular expressions in Hive 【发布时间】:2019-02-28 00:41:24 【问题描述】:我想通过删除任何不必要的内容来简化 Hive 中的 gmail 地址。我已经可以删除“。”使用“translate()”,但 gmail 还允许忽略放置在“+”和“@”之间的任何内容。以下正则表达式适用于 Teradata:
select REGEXP_REPLACE('test+friends@gmail.com', '\+.+\\@' ,'\\@');
给出:'test@gmail.com',但在 Hive 中,我得到:
失败:SemanticException [错误 10014]:第 1:7 行参数错误 ''\@'':org.apache.hadoop.hive.ql.metadata.HiveException:无法 执行方法 public org.apache.hadoop.io.Text org.apache.hadoop.hive.ql.udf.UDFRegExpReplace.evaluate(org.apache.hadoop.io.Text,org.apache.hadoop.io.Text,org.apache.hadoop.io.Text) 在对象 org.apache.hadoop.hive.ql.udf.UDFRegExpReplace@131b58d4 上 class org.apache.hadoop.hive.ql.udf.UDFRegExpReplace with arguments test+friends@gmail.com:org.apache.hadoop.io.Text, +.+@:org.apache.hadoop.io.Text, @:org.apache.hadoop.io.Text 大小为 3
如何让这个正则表达式在 Hive 中工作?
【问题讨论】:
您是否熟悉您计划经营的所有司法管辖区的相关法律?例如,在加拿大,我很确定您需要准确使用用户给您的电子邮件。这意味着您不能删除句点、+foo
等。
@Chris 这取决于他用这个做什么。如果他发送到修改后的地址,你有一点。如果他只是想从列表中删除重复项,这可能没问题。
无论法律要求如何,发送到与他人提供的地址不同的地址都是完全错误的。用户使用这些后缀是有原因的,您不应忽略它们。
这是“查找重复项”用例,因此这里的法规不是问题。
【参考方案1】:
您无需在正则表达式中转义 @
。试试:
select REGEXP_REPLACE('test+friends@gmail.com', '\+[^@]+@' ,'@');
您还应该使用[^@]+
而不是.+
,以便匹配在第一个@
处停止。否则,如果输入中有多个地址,则匹配将跨越所有地址。
【讨论】:
这对我不起作用:hive> select REGEXP_REPLACE('test+friends@gmail.com', '\+[^@]+@' ,'@'); FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''@'': org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public org.apache.hadoop.io.Text .. .....(类似错误) 我对 Hive 不熟悉,@
有什么特殊含义吗?
我不熟悉它的任何特殊含义,尽管我可能会遗漏一些东西。我想这是这个问题的部分原因。【参考方案2】:
我找到了答案:
选择 REGEXP_REPLACE('test+friends@gmail.com', '[+].+@' ,'@');
或
选择 REGEXP_REPLACE('test+friends@gmail.com', '\+.+@' ,'@');
成功了。 Teradata 和 Hive 在处理正则表达式的方式上似乎存在显着差异。
【讨论】:
以上是关于如何在 Hive 中使用正则表达式简化 g-mail 地址的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive 中使用正则表达式来提取第二个整数? [关闭]
如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符
Sparklyr/Hive:如何正确使用正则表达式(regexp_replace)?