如何使用 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方法的使用,超级详细!!!