PARSE_URL_TUPLE
功能概述
表函数,一次从 URL 中解析出多个部分(主机、路径、查询参数等),每个部分作为一列返回。需要从同一个 URL 取多个字段时,比多次调用 PARSE_URL 更简洁,URL 也只需解析一次。
语法
-- 在 SELECT 中直接调用
SELECT PARSE_URL_TUPLE(<url>, <part1> [, <part2> ...])
-- 配合 LATERAL VIEW 为每行展开
SELECT ... FROM <table>
LATERAL VIEW PARSE_URL_TUPLE(<url>, <part1> [, <part2> ...]) <alias> AS <col1> [, <col2> ...]
参数说明
<url>
<url>
:STRING 类型,要解析的 URL。
<part>
<part>
:STRING 类型,要提取的部分,每个 <part>
<part>
对应一个输出列。可以是常量,也可以是列。取值(大小写敏感,须大写):
| part | 含义 | 以 http://user:pass@example.com:8080/path/to?a=1&b=2#ref
http://user:pass@example.com:8080/path/to?a=1&b=2#ref 为例 |
|---|
PROTOCOL
PROTOCOL | 协议,统一转为小写 | http
http |
HOST
HOST | 主机名 | example.com
example.com |
PATH
PATH | 路径 | /path/to
/path/to |
QUERY
QUERY | 完整查询串 | a=1&b=2
a=1&b=2 |
QUERY:<key>
QUERY:<key> | 查询串中指定参数的值 | QUERY:a
QUERY:a → 1
1 |
REF
REF | 锚点(#
# 之后的部分) | ref
ref |
FILE
FILE | 路径加查询串 | /path/to?a=1&b=2
/path/to?a=1&b=2 |
AUTHORITY
AUTHORITY | 用户信息、主机和端口 | user:pass@example.com:8080
user:pass@example.com:8080 |
USERINFO
USERINFO | 用户信息 | user:pass
user:pass |
某个部分不存在时,该列返回 NULL。
使用示例
一次解析多个部分:
SELECT parse_url_tuple(
'http://user:pass@example.com:8080/path/to?a=1&b=&a1=regex#ref',
'HOST', 'PATH', 'QUERY', 'REF', 'PROTOCOL', 'AUTHORITY', 'USERINFO', 'QUERY:a');
| c0 | c1 | c2 | c3 | c4 | c5 | c6 | c7 |
|---|
| example.com | /path/to | a=1&b=&a1=regex | ref | http | user:pass@example.com:8080 | user:pass | 1 |
QUERY:a
QUERY:a
只匹配参数名完全等于
a
a
的参数,不会匹配
a1
a1
。
配合
LATERAL VIEW
LATERAL VIEW
解析表中的每一行,并为输出列命名:
SELECT url, host, path, id
FROM VALUES
('https://example.com/p?id=42'),
('https://shop.example.com/item?id=7&from=ad') AS t(url)
LATERAL VIEW parse_url_tuple(url, 'HOST', 'PATH', 'QUERY:id') parsed AS host, path, id;
注意事项
<part>
<part>
必须大写,如 'HOST'
'HOST'
。
- 只解析单个查询参数时,
PARSE_URL(url, 'QUERY', 'key')
PARSE_URL(url, 'QUERY', 'key')
更直接。
- 不带
LATERAL VIEW
LATERAL VIEW
调用时,输出列名为 c0
c0
、c1
c1
……,需要自定义列名时用 LATERAL VIEW ... AS
LATERAL VIEW ... AS
。
相关文档