配置单元中特定字符串的正则表达式

Posted

技术标签:

【中文标题】配置单元中特定字符串的正则表达式【英文标题】:regular expression in hive for a specific string 【发布时间】:2021-08-05 08:06:54 【问题描述】:

我在 hive 表中有一个列,它是一个地址列,我想将它分成 2 个。

有两种情况需要处理。

示例:

场景一:

输入列值: ABC DEF123 AD 输出列值: 第一列应该有ABC DEF 第 2 列应该有123 AD

另一个例子如下。

迈克尔·波斯顿875 海得拉巴

在这种情况下,分隔应该基于作为字符串值一部分的数字,如果字符串中有数字,那么两者都应该分开

场景 2:

输入值:ABC DEFPO BOX 5232 输出: 第 1 列:- ABC DEF 第 2 列:- PO BOX 5232

另一个例子如下。

海得拉巴 jhills 邮政信箱 522002

在这种情况下分离应该基于PO BOX

两个数据都在同一列中,我想根据字符串格式将数据更新为目标。就像一个不确定方法的案例声明。

注意:- 字符串长度可以变化,因为这是地址列。 有人可以帮我提供一个 hive 查询和 pyspark 吗?

【问题讨论】:

对于场景 #1,请查看:\w3+\W\w3+)(\d3\W\w2))。结果,您有 2 个组 - 请参阅:regex demo 您分享的格式是我分享的一个例子,字符串长度可能因地址而异。我们可以概括一下吗。 【参考方案1】:

使用 CASE 表达式可以检查它匹配哪个模板,并使用 regexp_replace 插入一些分隔符,然后用相同的分隔符分割。

演示(Hive):

with mytable as (
select stack(4,
'ABC DEF123 AD',
'MICHAEL POSTON875 HYDERABAD',
'ABC DEFPO BOX 5232',
'Hyderabad jhillsPO BOX 522002'
) as str
) --Use your table instead of this

select columns[0] as col1, columns[1] as col2
from
(
select split(case when (str rlike 'PO BOX') then regexp_replace(str, 'PO BOX','|||PO BOX')
                  when (str rlike '[a-zA-Z ]+\\d+') then regexp_replace(str,'([a-zA-Z ]+)(\\d+.*)', '$1|||$2')
                 --add more cases and ELSE part
              end,'\\|3') columns
  from mytable
)s

结果:

col1              col2  
ABC DEF           123 AD
MICHAEL POSTON    875 HYDERABAD
ABC DEF           PO BOX 5232
Hyderabad jhills  PO BOX 522002

【讨论】:

非常感谢,这符合我的要求。

以上是关于配置单元中特定字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

配置单元中的正则表达式替换解决方案以屏蔽前 6 个字符

hive serde 中多分隔符字符串的正则表达式

python 正则表达式

正则表达式排除特定字符串

使用正则表达式替换字符串中的特定字母

正则表达式