如何在 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中使用COALESCE
或IF()
,如果不匹配则返回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 仅提取数值?