【问题标题】:hive or impala function to get substring of a stringhive 或 impala 函数来获取字符串的子字符串
【发布时间】:2021-06-28 09:47:19
【问题描述】:

我的字符串(它是一个 hive 查询)有许多 FROM 和 JOIN 语句,我想使用 Regex 函数来获取这些语句之后的所有子字符串。

以下是示例字符串: str= '从 dbname.table1,table2 中选择 col1, col2, col3 左 JOIN 表 3 在 id=id 上 交叉 JOIN 表 4 其中过滤器='检查' 与行

要求的输出应该是:

例如: select Regex(str,'from ') => dbname.table1,table2

选择正则表达式(str,'JOIN') => table3 table4

【问题讨论】:

标签: hive impala


【解决方案1】:

您可以使用以下正则表达式来捕获FROMJOIN 关键字后跟的表。

((JOIN|join|From|from)\s)\w+((\.|,)\w+){0,}

请注意,我使用了简单和大写格式的关键字。如果查询字符串与正则表达式一致,则只能使用一种格式,或者可以进行不区分大小写的匹配。

上述正则表达式将给出以下结果。

Case 1:发件人

完整匹配:from dbname.table1,table2

比赛组1:from (注意末尾的空格)

Case 2:加入

完整匹配:JOIN table3JOIN table4

比赛组1:JOIN (注意末尾的空格)

现在,在每次匹配时,您都可以使用 match group1 结果替换 full match 结果中不需要的前缀(from JOIN )以获取表名。

使用这个网站玩和学习正则表达式:https://regex101.com/

编辑 1

在蜂巢中

regexp_extract('fooblabar', 'foo(.*?)(bar)', 1)

会给你第一组。在这种情况下,它是bla

编辑 2

对正则表达式的小更新以捕获 group3 中的结果

((JOIN|join|From|from)\s)(\w+((\.|,)\w+){0,})

这应该可以解决问题

select split(trim(regexp_replace('select Id from test1 where join test2','((JOIN|join|From|from)\s)(\w+((\.|,)\w+){0,})',' $3')),' ');

【讨论】:

  • 我试过了,但没用。你能帮我解决这个问题吗?我是这个功能的新手。谢谢
  • 我已经尝试过了,但没有给出任何结果:
  • select regexp_extract(“select Id from test1 where join test2”,'((JOIN|join|From|from)\s)\w+((\.|,)\w+){0, }',1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多