支持版本:0.13(更早版本中函数名为NPath)
源码参考:https://github.com/intel-hadoop/hive-on-spark/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/MatchPath.java
函数说明:
MatchPath根据窗口中列的数据匹配特定的Pattern.
根据筛选的结果列名,MatchPath匹配成功后返回符合Pattern的所有行数据中第一行的筛选列数据和一个Array<Struct> 格式的tpath字段数据
tpath中包含了符合Pattern的所有行中筛选列数据,每一行筛选数据都存在Struct<>中,Struct<>中的元素名称与筛选列相同
MatchPath包含至少4个参数:
1、匹配模式Pattern: 字符串格式,可以包含一个以上的Symbol,Symbol之间以“.”分隔,Symbol可以与*/+符号结合匹配0个以上或者一个以上,类似于正则表达式
2、符号Symbol: 与Pattern中的Symbol对应
3、符号条件
4、筛选结果列
使用案例:划分用户连续访问批次(sesseion)
sesseion:用户距离上一次访问超过30分钟记为一次新session
源数据
tmp.user_visit
使用MatchPath匹配距离上次访问不超过30分钟的Pattern
select
tpath
,tpath[0]
,tpath[0].user_id
,tpath[0].visit_time
,concat(tpath[0].user_id,"_",unix_timestamp(tpath[0].visit_time)) as session_id
from matchpath(
on
(select user_id,visit_time
from tmp.user_visit
) a
distribute by user_id sort by visit_time
arg1("A.B*"),
arg2("A"),
arg3(floor((unix_timestamp(visit_time) - unix_timestamp(lag(visit_time,1,"1900-01-01 00:00:00")))/60) >= 30),
arg4("B"),
arg5(floor((unix_timestamp(visit_time) - unix_timestamp(lag(visit_time,1,"1900-01-01 00:00:00")))/60) < 30),
arg6('user_id,visit_time,tpath')
)
结果:
原理: