Hive如何查找数据列中符合:??:格式的标签的字符位置
Hive匹配指定标签模式并返回位置的实现方法
Hive没有直接返回所有正则匹配结果位置的内置函数,但可以通过现有内置函数组合实现你的需求:
- 匹配你所描述的
:[任意字符]:格式标签的通用正则为:[^:]+:,可以适配任意非冒号的标签值场景;如果需要严格限制两个冒号中间仅为2个字符,将正则替换为:.{2}:即可。 - 如果仅需要获取第一个匹配标签的起始位置,可以直接用
instr配合regexp_extract实现:
SELECT instr(你的字符串字段, regexp_extract(你的字符串字段, '(:[^:]+:)', 1)) AS 第一个标签起始位置 FROM 你的表名;
- 如果需要返回单条记录中所有匹配标签的位置,可以结合
posexplode、窗口函数实现,示例代码如下:
SELECT 你的字符串字段, -- 累加计算标签在原字符串中的真实起始位置 SUM(LENGTH(分片内容)) OVER (PARTITION BY 你的字符串字段 ORDER BY 分片序号) + 分片序号 + 1 AS 标签起始位置, 匹配到的标签 FROM ( SELECT 你的字符串字段, pos AS 分片序号, part AS 分片内容, regexp_extract(part, '(:[^:]+:)', 1) AS 匹配到的标签 FROM 你的表名 -- 用正向预查正则分割字符串,保证标签单独在分片头部 LATERAL VIEW posexplode(SPLIT(你的字符串字段, '(?=:[^:]+:)')) t AS pos, part ) tmp WHERE 匹配到的标签 != '';
实现逻辑说明:先用正向预查的正则规则分割原字符串,保证每一个标签都会单独出现在分片内容的开头,再通过
posexplode函数给每个分片加上顺序编号,最后用窗口函数累加前面所有分片的长度,计算出每个标签在原字符串中的实际起始位置。
内容的提问来源于stack exchange,提问作者chandrakanth belde
相关产品推荐
相关产品推荐

