hive中的内置函数parse_url_tuple() 和内置函数 lateral view和 parse_url

Hive内置函数parse_url_tuple与lateral view
本文介绍了Hive中的内置函数parse_url_tuple()和lateral view。parse_url()可解析URL字符串,parse_url_tuple功能类似但能同时提取多个部分;lateral view可将右边表或结果与左边表合并。文中还给出了多个函数使用的示例。

hive中的内置函数parse_url_tuple() 和内置函数 lateral view

1.parse_url ()
解析URL字符串,partToExtract的选项包含[HOST,PATH,QUERY,REF,PROTOCOL,FILE,AUTHORITY,USERINFO]。
【host,path,query,ref,protocol,file,authority,userinfo】这些可以理解为关键字 通过关键字可以获得url中对应的字段数据。
parse_url_tuple功能类似parse_url(),但它可以同时提取多个部分并返回

举例 :
select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘PROTOCOL’) from dual; --http
select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘HOST’) from dual;—facebook.com​
select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘REF’) from dual;—空​
select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘PATH’) from dual;—/path/p1.php​
select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘QUERY’) from dual;—空​
​select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘FILE’) from dual;​—/path/p1.php?query=1​
​select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘AUTHORITY’) from dual;​—facebook.com​
​select parse_url(‘http://facebook.com/path/p1.php?query=1’, ‘USERINFO’) from dual;​—空

select parse_url(‘http://facebook.com/path/p1.php?query=1&name=3’, ‘QUERY’,‘name’)
在这里插入图片描述

select parse_url(‘http://facebook.com/path/p1.php?query=1&name=3’, ‘QUERY’’)
在这里插入图片描述
2.lateral view 是将右边的表或者结果合并到左边表 和左边表整合成一张表。

举例:
2.1.相当于拓展ods_weblog_origin表中的 http_referer字段 【原始表(左边表数据字段保持不变 新增拓展字段 并将原始表数据 导入新表中)】
create table t_ods_tmp_referurl as
SELECT a.,b.
FROM ods_weblog_origin a
LATERAL VIEW parse_url_tuple(regexp_replace(http_referer, “”", “”), ‘HOST’, ‘PATH’,‘QUERY’, ‘QUERY:id’) b as host, path, query, query_id;
2.2 相当于拓展ods_weblog_origin表中的time_local字段 并将原始表数据添加到新表 as select(查询添加))
–抽取转换time_local字段到中间表明细表 t_ods_tmp_detail

drop table if exists t_ods_tmp_detail;
create table t_ods_tmp_detail as
select b.*,substring(time_local,0,10) as daystr,
substring(time_local,12) as tmstr,
substring(time_local,6,2) as month,
substring(time_local,9,2) as day,
substring(time_local,11,3) as hour
From t_ods_tmp_referurl b;
2.3 是将原始表中的 url 和时间字段拓展 构成一张明细表 并查询填充数据
以上语句可以改写成:
insert into table ods_weblog_detail partition(datestr=‘20130918’)
select c.valid,c.remote_addr,c.remote_user,c.time_local,
substring(c.time_local,0,10) as daystr,
substring(c.time_local,12) as tmstr,
substring(c.time_local,6,2) as month,
substring(c.time_local,9,2) as day,
substring(c.time_local,11,3) as hour,
c.request,c.status,c.body_bytes_sent,c.http_referer,c.ref_host,c.ref_path,c.ref_query,c.ref_query_id,c.http_user_agent
from
(SELECT
a.valid,a.remote_addr,a.remote_user,a.time_local,
a.request,a.status,a.body_bytes_sent,a.http_referer,a.http_user_agent,b.ref_host,b.ref_path,b.ref_query,b.ref_query_id
FROM ods_weblog_origin a LATERAL VIEW parse_url_tuple(regexp_replace(http_referer, “”", “”), ‘HOST’, ‘PATH’,‘QUERY’, ‘QUERY:id’) b as ref_host, ref_path, ref_query, ref_query_id) c;

3.parse_url_tuple() 。

语法: parse_url(string urlString, string partToExtract [, string keyToExtract]),parse_url_tuple功能类似parse_url(),但它可以同时提取多个部分并返回
    返回值: string
    说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
  举例:

hive> select parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) from dual;

facebook.com

hive> select parse_url_tuple(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1’, ‘QUERY:k1’, ‘QUERY:k2’);

v1 v2

技术交流群 获得一个不错的连接 :https://www.twblogs.net/a/5b80dfed2b71772165a9de1a/zh-cn

<think>我们已知在Hive中执行`SHOW FUNCTIONS LIKE '*url*';`返回了两个内置函数:`parse_url``parse_url_tuple`。 因此,原始查询中的`url_trans`函数不存在,可能是自定义函数(UDF)未注册,或者函数名拼写错误。 根据错误信息,我们需要解决`url_trans`函数不可用的问题。既然Hive内置了`parse_url``parse_url_tuple`,我们可以考虑使用这些内置函数来替代`url_trans`的功能。 `parse_url`函数用于解析URL字符串,并返回指定的部分。其语法为: parse_url(url, part) 其中,`part`可以是以下值(不区分大小写): HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:<KEY> 例如,要获取URL的主机名,可以使用:`parse_url(url, 'HOST')` 而`parse_url_tuple`是一个UDTF(表生成函数),可以同时解析URL的多个部分,并且可以返回多个列。通常与`LATERAL VIEW`一起使用。 因此,如果`url_trans`的功能是提取URL的特定部分,我们可以用`parse_url`来替代。 但是,原始查询中还有另一个函数`get_city_by_ip`,它可能也是一个自定义函数。由于错误只报了`url_trans`,所以先解决`url_trans`的问题。 解决方案: 1. 如果`url_trans`的功能可以用`parse_url`实现,则替换。 2. 如果`url_trans`有特殊逻辑(如自定义的转换规则),则需要注册自定义UDF。 假设`url_trans`的功能是提取URL的主机名(即域名),那么可以这样改写: 将 `url_trans(url)` 替换为 `parse_url(url, 'HOST')` 改写后的查询: ```sql SELECT parse_url(url, 'HOST') as url_host, get_city_by_ip(client_ip) FROM comm.ods_behavior_log LIMIT 10; ``` 注意:如果`get_city_by_ip`也不是内置函数,那么同样需要注册自定义函数。目前错误只报了`url_trans`,所以先处理这个。 如果`url_trans`的功能不是简单的提取主机名,而是有其他操作(比如URL解码、去掉参数等),那么可能需要自定义UDF,或者结合多个内置函数实现。 另外,如果`url_trans`是一个自定义函数,那么需要按照之前提到的步骤注册UDF。 因此,根据现有信息,我们建议先尝试使用内置函数`parse_url`来替代,如果满足需求则无需自定义函数。 如果上述方案不适用,则需要检查是否存在自定义函数`url_trans`的UDF,并确保其正确注册。 注册自定义函数的步骤(如果已有UDF): 1. 将包含UDF的JAR文件添加到Hive会话中:`ADD JAR /path/to/jarfile.jar;` 2. 创建临时函数:`CREATE TEMPORARY FUNCTION url_trans AS 'com.example.UrlTransUDF';` (其中`com.example.UrlTransUDF`是UDF类的全限定名) 注意:如果是永久函数,可以使用`CREATE FUNCTION`,但需要将JAR文件上传到HDFS,并在创建时指定。 综上所述,优先使用内置函数`parse_url`,如果无法满足再考虑注册自定义函数。 §§相关问题§§1. 如何用Hive内置函数parse_url解析URL的路径部分?2. 如果get_city_by_ip也报错,如何解决?3. 如何编写注册Hive自定义UDF函数?4. parse_urlparse_url_tuple函数的主要区别是什么?5. 在Hive中如何查看已注册的自定义函数?</think>根据您提供的Hive函数查询结果,系统内置的URL相关函数只有`parse_url``parse_url_tuple`,没有`url_trans`函数。这意味着: 1. **`url_trans`不是Hive内置函数** - 需要自定义实现或使用替代方案 2. **建议替代方案**: ```sql -- 使用parse_url解析URL特定部分(如域名) SELECT parse_url(url, 'HOST'), get_city_by_ip(client_ip) FROM comm.ods_behavior_log LIMIT 10; -- 使用parse_url_tuple同时解析多个部分 SELECT parsed_url.*, get_city_by_ip(client_ip) FROM comm.ods_behavior_log LATERAL VIEW parse_url_tuple(url, 'HOST', 'PATH', 'QUERY') parsed_url AS host, path, query LIMIT 10; ``` 3. **若必须使用url_trans**: - 确认是否存在自定义UDF的JAR包 - 注册函数:`CREATE FUNCTION url_trans AS 'com.xxx.UrlUDF' USING JAR 'hdfs:///udfs/url.jar';`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值