You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hive/Impala正则提取:从可变数量key-value对中提取key值

解决Hive/Impala中两类正则提取问题(适配任意数量key)

刚好碰到过类似的需求,给你整理两个实用的方案来解决这两个提取问题,尤其是第二个要适配任意数量key的情况:

1. 提取文本开头至第一个'-'的首个单词

这个需求比较直接,用简单的正则分组就能搞定,核心是匹配开头到第一个'-'之间的所有非'-'字符:

-- 示例:提取"abc-bca/abc.s-13:13:13/any-x/keyn-1"中的"abc"
SELECT regexp_extract(your_column_name, '^([^-]+)-', 1) AS first_word
FROM your_table;

正则解释:

  • ^:匹配字符串开头
  • ([^-]+):捕获分组1,匹配任意非'-'的字符(直到遇到第一个'-'为止)
  • -:匹配第一个'-',作为终止符

2. 提取所有位于'/'与'-'之间的单词(适配任意数量)

原来的固定分组正则只能处理固定数量的key,要适配任意数量,我们需要结合regexp_replace先把所有目标内容提取并拼接,再按需处理:

方案1:提取为空格分隔的字符串

如果需要把所有匹配的单词用空格连起来(比如示例中的"abc.s any keyn"),可以用以下语句:

-- 示例:提取所有'/'与'-'之间的单词
SELECT 
  trim(regexp_replace(your_column_name, '^.*?-|/([^-]+)-.*?(?=/|$)|-[^/]*$', '$1 ')) AS middle_words
FROM your_table;

正则替换逻辑解释:

我们通过三次匹配替换,只保留需要的内容:

  • ^.*?-:匹配从开头到第一个'-'的所有内容,替换为空(去掉开头不需要的部分)
  • /([^-]+)-.*?(?=/|$):匹配/开头,捕获/和-之间的非'-'字符(分组1),然后跳过-到下一个/或字符串结尾的内容,替换为分组1 + 空格
  • -[^/]*$:匹配最后一个-到字符串结尾的内容,替换为空(去掉末尾不需要的部分)
  • 最后用trim()去掉首尾多余的空格

方案2:拆分为多行记录

如果需要把每个匹配的单词单独成行(方便后续分析),可以结合split和explode:

SELECT 
  first_word,
  middle_word
FROM (
  SELECT 
    regexp_extract(your_column_name, '^([^-]+)-', 1) AS first_word,
    -- 先提取为空格分隔的字符串,再拆分成数组
    split(trim(regexp_replace(your_column_name, '^.*?-|/([^-]+)-.*?(?=/|$)|-[^/]*$', '$1 ')), ' ') AS middle_words_arr
  FROM your_table
) t
-- 把数组拆分成多行
LATERAL VIEW explode(middle_words_arr) exploded AS middle_word;

这个方案不管你的字符串里有多少个/和-组成的key,都能全部提取出来,完全适配任意数量的场景。


内容的提问来源于stack exchange,提问作者user3753950

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:23:56