PARSE_URL 解析 URL
PARSE_URL 从 URL 中取出 HOST、PATH、QUERY 等部分。MaxCompute、Hive、Spark 和 Flink 支持第三个参数,可以直接取某个查询参数;StarRocks 和 Doris 只接受两个参数。无效 URL 的处理也不同,MaxCompute 和 StarRocks 会报错。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | PARSE_URL(url, part[, key]) | part 可取 HOST、PATH、QUERY、REF、PROTOCOL、AUTHORITY、FILE、USERINFO。无效 URL 会报错。 | 官方文档 |
| Hologres | 不支持 | — | Hologres 字符串函数文档中没有找到 PARSE_URL,需要在实例中确认。 | 待核实 |
| StarRocks | 支持 | parse_url(expr1, expr2) | 只有两个参数,QUERY 不能直接取某个参数值。part 区分大小写,无效 URL 会报错。 | 官方文档 |
| Doris | 支持 | PARSE_URL(url, name) | 只有两个参数,name 不区分大小写,另外支持 PORT。name 取值非法时报错。 | 官方文档 |
| Hive | 支持 | parse_url(urlString, partToExtract[, keyToExtract]) | 第三个参数可以取 QUERY 中某个键的值。批量取多个部分可以用 parse_url_tuple。 | 官方文档 |
| Spark SQL | 支持 | parse_url(url, partToExtract[, key]) | Spark 4 默认开启 ANSI,URL 无法解析时会报错;try_parse_url 在这种情况下返回 NULL。 | 官方文档 |
| Flink SQL | 支持 | PARSE_URL(string1, string2[, string3]) | 第三个参数可以取 QUERY 中某个键的值,任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- StarRocks 和 Doris 没有第三个参数。取查询参数时,可以先取 QUERY,再用 REGEXP_EXTRACT 或 SPLIT_PART 从结果中提取。
- StarRocks 的 part 区分大小写,必须写成大写的 HOST、QUERY;Doris 不区分大小写。从 Hive 迁移时,如果原 SQL 用了小写 part,迁到 StarRocks 会出错。
- 无效 URL 的处理不同。MaxCompute 和 StarRocks 会报错;Spark 4 默认开启 ANSI,也会报错,可以改用 try_parse_url。日志类数据里常有格式不规范的 URL,迁移后要先确认会不会导致整个作业失败。
示例
从页面地址中取出域名和来源参数
SELECT PARSE_URL(page_url, 'HOST') AS host, PARSE_URL(page_url, 'QUERY', 'utm_source') AS source FROM page_views;SELECT parse_url(page_url, 'HOST') AS host, regexp_extract(parse_url(page_url, 'QUERY'), 'utm_source=([^&]*)', 1) AS source FROM page_views;SELECT parse_url(page_url, 'HOST') AS host, regexp_extract(parse_url(page_url, 'QUERY'), 'utm_source=([^&]*)', 1) AS source FROM page_views;SELECT parse_url(page_url, 'HOST') AS host, parse_url(page_url, 'QUERY', 'utm_source') AS source FROM page_views;SELECT try_parse_url(page_url, 'HOST') AS host, try_parse_url(page_url, 'QUERY', 'utm_source') AS source FROM page_views;SELECT PARSE_URL(page_url, 'HOST') AS host, PARSE_URL(page_url, 'QUERY', 'utm_source') AS source FROM page_views;