Hive如何从字符串字段中提取所有匹配的URL链接?
Hive从字符串中提取所有URL的解决方法
你原有查询失效的核心原因是正则匹配没有覆盖字符串的所有内容,仅能匹配到第一个URL及之前的片段,未被匹配到的剩余内容会原样保留,最终返回完整的原字段内容。
方案1:Hive 2.1.0及以上版本使用regexp_extract_all(推荐)
这个函数可以直接提取字符串中所有匹配正则的内容,返回数组类型,写法最简单直观:
-- 提取结果为URL数组 select regexp_extract_all( metainfo.body, '(http|ftp|https):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&;:\\/~+#-]*[\\w@?^=%&;\\/~+#-])', 0 -- 0代表返回整个正则匹配到的完整URL内容 ) as url_list from 你的表名;
如果需要转成逗号分隔的字符串,可以搭配concat_ws使用:
-- 提取结果为逗号分隔的URL字符串 select concat_ws(',', regexp_extract_all( metainfo.body, '(http|ftp|https):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&;:\\/~+#-]*[\\w@?^=%&;\\/~+#-])', 0 ) ) as url_str from 你的表名;
方案2:低版本Hive使用regexp_replace实现
如果你的Hive版本低于2.1.0没有regexp_extract_all函数,可以修改正则规则,覆盖所有字符串内容,将非URL部分全部替换为空,仅保留URL和分隔符:
select regexp_replace( metainfo.body, '.*?((http|ftp|https):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&;:\\/~+#-]*[\\w@?^=%&;\\/~+#-]))|.*', '$1,' ) as url_str from 你的表名;
用你提供的测试字符串验证,该语句输出为 http://a.com,https://b.com,,完全符合预期。
注意事项
Hive中书写正则表达式时,反斜杠需要做双重转义,所以路径分隔符/前的转义符要写为\\。
内容的提问来源于stack exchange,提问作者Arun Singhal
相关产品推荐
相关产品推荐

