配置单元中特定字符串的正则表达式
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
【讨论】:
非常感谢,这符合我的要求。以上是关于配置单元中特定字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章