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
相关产品推荐
相关产品推荐

