hive 或 impala 函数来获取字符串的子字符串

Posted

技术标签:

【中文标题】hive 或 impala 函数来获取字符串的子字符串【英文标题】:hive or impala function to get substring of a string 【发布时间】: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

【问题讨论】:

恐怕您的问题不够清楚,无法提供答案。特别是您试图用 x,y,z 解释的内容。请阅读***.com/help/minimal-reproducible-example 我希望现在很清楚...... 【参考方案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)

以上是关于hive 或 impala 函数来获取字符串的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表

使用 Impala 或 Hive 提取表列中的多个字符串元素

Hive/Impala 列评论在几个字符后被截断

Impala 查询以获取计数聚合函数中使用的列的样本值

在 hive/impala sql 中按日期获取数据,

Hive/Impala 选择并平均所有行键版本