Hive:字符串中的第一次和最后一次出现

Posted

技术标签:

【中文标题】Hive:字符串中的第一次和最后一次出现【英文标题】:Hive: First and last occurrence in a string 【发布时间】:2019-10-16 03:48:46 【问题描述】:

我有一个id列和一个字符串列如下:

id   values
1   AD123~DF123~SQ345
2   CF234~DF234
3   BG123

我需要 Hive 中以下列的第一次出现和最后一次出现

id  first   last    
1   AD123   SQ345    
2   CF234   DF234    
3   BG123   BG123 

我已经尝试使用HIVE拆分功能解决了

select id, split(values, '\~') [0] as first, reverse(split(reverse(values), '\~')[0]) from demo;

我在 Hive 中不断收到语法错误,说 [ 是意外的。

我发现的另一种选择是正则表达式,但我是 Hive 的新手,有人可以在这里帮助我使用正则表达式或拆分吗?谢谢

【问题讨论】:

【参考方案1】:

使用拆分:

with your_table as(
select stack(3,
1, 'AD123~DF123~SQ345',
2, 'CF234~DF234',
3, 'BG123'
 ) as (id,values)
 ) --use your_table instead of this

select id, values[0] as first, values[size(values)-1] as last
from
( 
 select id, split(values,'~') values
   from your_table t
)s   
;

返回:

id      first   last
1       AD123   SQ345
2       CF234   DF234
3       BG123   BG123

使用正则表达式:

select id, 
       regexp_extract(values,'^([^~]*)',1) as first,
       regexp_extract(values,'([^~]*)$',1) as last
   from your_table t 
;

【讨论】:

以上是关于Hive:字符串中的第一次和最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章

如何在PostgreSQL中的字符串中查找特定字符的第一次和最后一次出现

必须通过剥离符号 ^ 字符的最后一次出现以通过正则表达式提取结束来提取单词的开头

Hive 查询仅替换第一次出现的子字符串

替换字符串中最后一次出现的字符串

子字符串,在最后一次出现字符之后?

XSLT:查找字符串中的最后一次出现