如何在 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 正则表达式

如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符

Sparklyr/Hive:如何正确使用正则表达式(regexp_replace)?

神级程序员教你如何在C语言中巧用正则表达式,简化处理,提高效率

如何在配置单元中使用正则表达式排除字符串中的特殊字符