Hive使用窗口函数分时间间隔规划用户会话-lag/sum

本文介绍了一种基于时间戳和用户行为数据的session划分方法,通过判断用户动作间的时间间隔来确定不同的会话,适用于分析用户在应用中的活跃模式。

背景

用户可能在app上活跃多次,而这多次界定为半个钟,也就是说,假如我7点到8点这段期间使用了app且进行了活跃操作,隔了半个钟后我重新打开了app进行了活跃的操作,假设活跃时间区间为12点到13点,那么,7-8点这段时间我们定为session1,12-13点这段时间我们定为session2

思路

根据时间戳reporttime来针对用户进行排序,获取这段期间的动作时间里线,使用lag进行判别,假设本次动作与上次动作时间间隔操作1800s(半个钟) 那么就赋予1作为标识

实现

select
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  业务模块
    ,action --  string  用户行为
    ,obj2 --    string  对象2
    ,platform --    string  平台(iOS、Android等)
    ,source --  string  来源
    ,timelong --    bigint  时长
    -- ,timestr -- string  上报时间
    ,reporttime	--	string	数据上报时间戳(后台默认添加,精确到秒,如1556436373)
    ,is_new -- 1 表示新用户,0表示老用户
	,sum(if(reporttime - pre_rt > 1800, 1, 0)) over(partition by uin order by reporttime asc) as session_id
	,pre_rt
from 
(

select
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  业务模块
    ,action --  string  用户行为
    ,obj2 --    string  对象2
    ,platform --    string  平台(iOS、Android等)
    ,source --  string  来源
    ,timelong --    bigint  时长
    -- ,timestr -- string  上报时间
    ,reporttime	--	string	数据上报时间戳(后台默认添加,精确到秒,如1556436373)
    ,is_new
	,lag(reporttime, 1,  unix_timestamp()) over(partition by uin order by reporttime asc) as pre_rt
from 
(
select 
    tdbank_imp_date -- string  partition fields
    ,tb1.uin -- string  QQ或微信
    ,module --  string  业务模块
    ,action --  string  用户行为
    ,obj2 --    string  对象2
    ,platform --    string  平台(iOS、Android等)
    ,source --  string  来源
    ,timelong --    bigint  时长
    -- ,timestr -- string  上报时间
    ,reporttime	--	string	数据上报时间戳(后台默认添加,精确到秒,如1556436373)
    ,if(tb2.uin is not null, 1, 0) as is_new -- 1 表示新用户,0表示老用户
from 
(
select 
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  业务模块
    ,action --  string  用户行为
    ,obj2 --    string  对象2
    ,platform --    string  平台(iOS、Android等)
    ,source --  string  来源
    ,timelong --    bigint  时长
    -- ,nvl(timestr, reporttime) as timestr -- string  上报时间
    ,nvl(reporttime, timestr) as reporttime	--	string	数据上报时间戳(后台默认添加,精确到秒,如1556436373)


FROM
base_report_tb
WHERE
tdbank_imp_date between  ${YYYYMMDD}00 AND  ${YYYYMMDD}23  
) tb1 left join
(
select
    uin
FROM
    new_users
WHERE ftime = ${YYYYMMDD}

) tb2 on tb1.uin = tb2.uin
) t 
) t2
-- limit 100000



-- is_new -- 是否新用户
-- session_id -- 会话id
Hive使用HDFS命令上传JAR文件到指定目录时,需要确保HDFS路径的权限设置正确,并且Hive能够访问该路径。以下是一些可能遇到的问题及其解决方法: ### HDFS路径权限问题 在执行`hdfs dfs -mkdir /hive/udf_jars`命令时,如果当前用户没有足够的权限,将无法创建目录。可以通过以下命令更改HDFS目录的权限: ```bash hdfs dfs -chmod 777 /hive ``` 该命令将`/hive`目录的权限设置为所有用户均可读、写、执行,确保后续操作不会因权限问题而失败[^1]。 ### 文件上传失败 在执行`hdfs dfs -put /root/eduhq/udf_jars/hive-udf-behavior-1.0.0.jar /hive/udf_jars/`命令时,如果本地文件路径或HDFS路径不正确,或者文件已经被上传过,可能会导致上传失败。可以通过以下命令检查HDFS中是否已经存在该文件: ```bash hdfs dfs -ls /hive/udf_jars/ ``` 该命令将列`/hive/udf_jars/`目录下的所有文件,确认目标JAR文件是否已经存在。如果文件已存在,可以先删除该文件,再重新上传: ```bash hdfs dfs -rm /hive/udf_jars/hive-udf-behavior-1.0.0.jar hdfs dfs -put /root/eduhq/udf_jars/hive-udf-behavior-1.0.0.jar /hive/udf_jars/ ``` 上述命令将先删除HDFS中已存在的同名文件,再重新上传新的JAR文件[^1]。 ### Hive中注册UDF 在将JAR文件上传到HDFS后,需要在Hive中注册该JAR文件,并创建对应的函数。可以通过以下SQL语句实现: - **创建临时函数**: ```sql CREATE TEMPORARY FUNCTION udf_behavior AS 'com.example.UdfBehavior' USING JAR 'hdfs://<namenode>:<port>/hive/udf_jars/hive-udf-behavior-1.0.0.jar'; ``` 此命令会创建一个临时函数`udf_behavior`,仅在当前会话中有效,退会话后该函数将不再存在。 - **创建永久函数**: ```sql CREATE FUNCTION udf_behavior AS 'com.example.UdfBehavior' USING JAR 'hdfs:///hive/udf_jars/hive-udf-behavior-1.0.0.jar'; ``` 此命令会创建一个永久函数`udf_behavior`,即使退Hive会话,该函数仍然存在。但需要注意的是,在创建永久函数之前,必须确保Hive的配置中已经正确设置了JAR文件的路径[^1]。 ### 删除函数 如果需要删除已经创建的函数,可以使用`DROP FUNCTION`命令: - **删除临时函数**: ```sql DROP TEMPORARY FUNCTION IF EXISTS udf_behavior; ``` 该命令会删除一个临时函数,如果该函数不存在,则不会报错。 - **删除永久函数**: ```sql DROP FUNCTION IF EXISTS udf_behavior; ``` 该命令会删除一个永久函数,如果该函数不存在,则不会报错[^1]。 ### 管理JAR文件 在Hive中管理JAR文件时,可能需要添加或删除JAR文件。可以使用以下命令: - **添加JAR文件**: ```bash ADD JAR hdfs://<namenode>:<port>/hive/udf_jars/hive-udf-behavior-1.0.0.jar; ``` 该命令会将指定的JAR文件添加到Hive的类路径中,以便Hive可以访问该JAR文件中的类。 - **删除JAR文件**: ```bash DELETE JAR hive-udf-behavior-1.0.0.jar; ``` 该命令会从Hive的类路径中删除指定的JAR文件[^1]。 ### 总结 通过上述命令,可以有效地在HDFS中创建目录、上传JAR文件,并在Hive中注册UDF。这些步骤是大数据处理中常见的操作,确保Hive能够正确加载和使用自定义函数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值