如何使用 reg_extract 或 split 在 Hive 中的特殊字符之后打印字符串的第一次出现?

Posted

技术标签:

【中文标题】如何使用 reg_extract 或 split 在 Hive 中的特殊字符之后打印字符串的第一次出现?【英文标题】:How do I print the first occurence of a string after a special character in Hive using reg_extract or split? 【发布时间】:2021-12-30 08:55:55 【问题描述】:

我在蜂巢中陷入了两难境地。我在 Hive 中的数据集如下所示:

##214628##564#7576#7876

#12771#242###256823

###3264###7236473####3

在每种情况下,我只想打印 # 之后的第一个字符串。所以输出应该是这样的:

214628

12771

3264

我尝试使用 reg_extract 函数,但可惜我只得到 NULL 值。由于 hive 不支持 reg_substr,因此以下语法不起作用:

to_number(trim(regexp_substr(col_name,'[^#]+',1,1)))

欢迎提出建议!

【问题讨论】:

【参考方案1】:

你可以使用 regexp_replace 然后 substr 组合。

首先使用regexp_replace()从字符串中删除所有多次出现的#。

regexp_replace(col,'#+','#') -- for data '#####123##' this will produce '#123#'

然后使用 substr 删除第一个 #。然后使用 instr 获取从 first 到 # 的所有内容。

substr(substr(str,2),1, instr(substr(str,2),'#')-1)  this will produce '123'

你可以在下面看到整个 sql。

select  substr(substr(str,2),1, instr(substr(str,2),'#')-1) as result
from (
SELECT regexp_replace('#####123##','#+','#') as str) a

我假设你总是在开头有#。如果只是添加if left(str,1)='#'...并根据数据进行处理。

【讨论】:

非常感谢您提供此解决方案!我实际使用过:select REGEXP_EXTRACT('###23286####24739#####','[^#]+',0);但你的解决方案似乎更万无一失,所以我想我会去的

以上是关于如何使用 reg_extract 或 split 在 Hive 中的特殊字符之后打印字符串的第一次出现?的主要内容,如果未能解决你的问题,请参考以下文章

js的split分割问题:通过<br>或<br/>进行分割,如何使用正则表达式来表示?

Java面试题17 如何把一个逗号分隔的字符串转换为数组? 关于String类中split方法的使用,超级详细!!!

如何使用 re.split 在 python 中拆分两列从 CSV 中查找字符串值

如何使用 sklearn 将数据拆分为 3 个或更多部分

使用Split或Split方法来创建字符串数组

在java中使用分隔符为'|'的split函数字符(或符号)[重复]