如何在 impala regexp_extract 方法中使用正则表达式 OR 运算符并获得不同的捕获组

Posted

技术标签:

【中文标题】如何在 impala regexp_extract 方法中使用正则表达式 OR 运算符并获得不同的捕获组【英文标题】:How to use regex OR operation in impala regex_extract method and get different capture group 【发布时间】:2017-01-18 08:32:16 【问题描述】:

我有以下table1 属性co

|-----------------------------------------
| co
|-----------------------------------------
| fsdsdf "This one" fdsfsd ghjhgj "sfdsf"
| Just This 
|-----------------------------------------

如果有引号 - 我想获得第一次出现的内容。如果没有引号,我想按原样返回内容。 对于上面的例子: 对于第一行 - This one 对于第二行 - Just This 我在 Impala 中有解决第一种情况的 SQL 代码:

select regexp_extract (co, '"([^"]*")',1) from table1

如何将其概括为检测并返回下一个案例所需的结果?

【问题讨论】:

我猜你可以在你的sql中使用COALESCEIF(),如果不匹配则返回hole string。 SQL 不是执行此操作的最佳工具。您是如何最终不得不在 Impala 中清理这些数据的? 数据已经在 impala 中。我想使用 REGEX 功能而不是上面的 SQL 功能,因为它更有效。我认为解决方案可以在 REGEX 中使用 OR 表达式,例如:***.com/questions/8020848/… 【参考方案1】:

你不能在 impala 中概括它。就您遇到的问题而言,它需要 OR |在你的正则表达式中实现。使用 regex_extract 您需要输入捕获组编号。到底 。例如

select regexp_extract (co, '"([^"]*")',1) from table1

但与 |正则表达式中的操作数,捕获组对于两种情况都必须不同。您无法在 regex_extract 方法中定义。

说如果 (A)|(B) 是您的正则表达式,那么您的第一个案例捕获组将是 1 并且您的第二个案例捕获组将是 2 。但是你不能把 1 和 2 都放在你的 regex_extract 语法中。

通用正则表达式语法将是(我猜这在 impala 分组中不起作用):

^(?!.*")(.*)$|^[^"]*"(.*?)".*$

Watch out the capture groupings

在链接中,您将看到 “This One” 被捕获为第 2 组 Just this 被捕获为第 1 组

【讨论】:

【参考方案2】:

使用联合检查此项。

 select regexp_extract (co, '"([^"]*")',1) from table1
 union
 select co from table1 where co like '"%"'

【讨论】:

那不是正则表达式 OR ,不是吗?【参考方案3】:

您可以使用if 函数并将RegEx 函数放入其中作为参数。所以,

if(regexp_like(co,'"'),
   regexp_extract(co,'"([^"]*)',1), co)

【讨论】:

以上是关于如何在 impala regexp_extract 方法中使用正则表达式 OR 运算符并获得不同的捕获组的主要内容,如果未能解决你的问题,请参考以下文章

当 regexp_like 和 regexp_extract 工作正常时,Impala regexp_like 查询返回 null

Hive 和 Impala 之间的正则表达式的语法是不是不同?

如何在第 n 次出现配置单元之前进行 regexp_extract

如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?

如何使用 talend 在 hive 上的分隔符 nth 之间进行 regexp_extract

如何仅使用 Hive 中的 regexp_extract 函数提取标点符号