Hive中regexp_extract提取URL分类编号返回空值问题排查
Hive中regexp_extract提取URL分类编号返回空值问题排查
嘿,我来帮你捋捋这个问题~你说测试编辑器里正则能用,但Hive里返回空,大概率是Hive的正则语法特性搞的鬼,咱们一步步排查:
最可能的原因:正则转义问题
Hive里的字符串字面量对反斜杠有特殊处理——单个\是转义符,所以如果要在正则里表示\(比如用来转义/),得写成两个\\才行。你原来的正则'\/\d{1,3}-'在Hive里会被解析成'/d{1,3}-'(因为\/被转义成了/,而\d被当成了普通的d),这自然匹配不到任何内容!
修正后的正则应该是这样的:
regexp_extract(url_string, '\\/\\d{1,3}-', 0)
你可以先拿这个在Hive里跑个测试,比如用你给的示例URL:
SELECT regexp_extract('https://www.google.com/search/228-bmw/location', '\\/\\d{1,3}-', 0);
正常应该返回/228-。
其他可能的排查方向
如果修正转义后还是不行,那可以看看这几点:
- 检查
url_string字段的实际内容:有没有可能URL里的分类编号后面的“-”是全角的长横杠(—),而不是你以为的半角短横杠(-)?或者URL里有空格、特殊字符干扰?可以用substr(url_string, 1, 100)先看看样本数据的真实格式。 - 确认字段里确实存在符合格式的内容:比如有没有可能部分URL根本没有分类编号,导致返回空?可以加个过滤条件先筛选出你觉得应该匹配的URL,再测试提取:
SELECT regexp_extract(url_string, '\\/\\d{1,3}-', 0) FROM your_table WHERE url_string LIKE '%/%-%' LIMIT 10;
- 用
regexp_replace辅助测试:把匹配的内容替换成标记,看看正则能不能命中:
SELECT regexp_replace(url_string, '\\/\\d{1,3}-', '【MATCHED】') FROM your_table LIMIT 10;
如果能看到【MATCHED】,说明正则是有效的,只是你之前的查询可能没筛选到有分类编号的行。
备注:内容来源于stack exchange,提问作者Pawels
相关产品推荐
相关产品推荐

