hive计算网页停留时长
hive表结构例如以下:
create table pv_user_info(
session_id string,
user_id string,
url string,
starttime bigint
);
主要就是这几个字段实用。省略其它。
实现方式:userid和sessionid分组后并按时间降序排序,降序排序后。第一行就是该用户最后一次浏览的网页。最后一行是第一次浏览的网页,第一行的starttime和第二行的starttime相减就是第二行停留时间。
这里会有几个误差
用户最后一次浏览的网页时长:由于不知道用关闭浏览器的时间。所以没办法计算,就返回一个特定的值吧,我这里返回的是0。
跨天:任务是按天统计,还没有第二天的数据,所以不考虑跨天。
连续点开多个网页:按上面的实现方式就会有误差。这是没办法的。
按产生日志文件的结果看。仅仅能用这样的实现方式,除非专门写个js记录网页停留时长(不知是否可行),那么就不须要用hive了。
详细实现:
1.要实现行与行之间的比較或算加减法hive sql是实现不了的,仅仅有自己定义函数UDF
2.定义全局变量,存上次浏览时间。sessionid。userid
3.第一次调用evaluate方法上次浏览时间肯定是空的。也就是说是用户在这一天里最后一次浏览网页的时间,直接返回0即可了。
4.再次调用evaluate方法要推断是不是同上一次调用evaluate方法是不是同一个用户同一个会话。假设是的话就相减。
5.调用evaluate方法假设和上一次调用不是一个用户。说明这个网页是还有一个用户最后一次浏览网页的时间。直接返回0。
hiveUDF代码
import org.apache.hadoop.hive.ql.exec.UDF; public class CalcUDF extends UDF { // 记录上一次訪问信息
private String[] lastLine = new String[2];; // 记录上次一次訪问时间
private Long lastTime = null; public Long evaluate(Long currentTime, String[] currentLine) {
if (lastTime == null) { lastTime = currentTime;
for (int i = 0; i < currentLine.length; i++) {
lastLine[i] = currentLine[i];
} return 0L;
} else {
// 同一个用户sessionId 和 userId 相等
if (currentLine[0].equals(lastLine[0])&& currentLine[1].equals(lastLine[1])) {
Long useTime = lastTime - currentTime; lastTime = currentTime; for (int i = 0; i < currentLine.length; i++) {
lastLine[i] = currentLine[i];
}
return useTime;
} else { // 还有一个用户
lastTime = currentTime;
for (int i = 0; i < currentLine.length; i++) {
lastLine[i] = currentLine[i];
}
return 0L;
}
}
}
}
将代码打成jar包。上传到/home/hadoop/test/
进入hive命令行,运行:
add jar /home/hadoop/test/hiveUDF.jar; // 加入jar包 create temporary function calc as 'com.orange.hadoop.CalcUDF'; //创建函数 //最后运行hive sql select session_id,user_id,url,starttime,
calc(starttime,user_id,session_id)
from
(select * from pv_user_info distribute by user_id,session_id sort by user_id,session_id ,starttime desc) t;
这是我的实现方式。有没有更好的解决方式?
hive计算网页停留时长的更多相关文章
- 使用Scala编写Spark程序求基站下移动用户停留时长TopN
使用Scala编写Spark程序求基站下移动用户停留时长TopN 1. 需求:根据手机基站日志计算停留时长的TopN 我们的手机之所以能够实现移动通信,是因为在全国各地有许许多多的基站,只要手机一开机 ...
- js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长
html: <!doctype html><html><head><meta charset="utf-8"><title&g ...
- jave 计算音视频时长
File source = new File("视频.mp4"); Encoder encoder = new Encoder(); try { MultimediaInfo in ...
- Fragment时长统计那些事
注:本文同步发布于微信公众号:stringwu的互联网杂谈 frament时长统计那些事 页面停留时长作为应用统计的北极星指标里的重要指标之一,统计用户在某个页面的停留时长则变得很重要.而Fragme ...
- PHP根据秒计算持续时长
/** * 计算持续时长 * * @param int $second 秒数 * @return string $duration 5天10小时43分钟40秒 */ function second2d ...
- jq计算总时长
1: <style> .item { width: 500px; height: 50px; margin: 0 auto; text-align: center; font-size: ...
- js计算在线时长
后台传来毫秒,前台转换成对应的时分秒 //在线时长 function longTime(seconds){ //总秒数 //seconds=seconds/1000; //得到小时 var hour ...
- 【Android端 APP 启动时长获取】启动时长获取方案及具体实施
一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...
- js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总
在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要. 什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...
随机推荐
- PHP100视频教程-->视频下载
链接:https://pan.baidu.com/s/14tbX1rz3hYSKY6k0T6WVzg提取码:kypy PHP是一种目前最流行的服务端Web程序开发语言之一.PHP主要的特点是语法简单易 ...
- django--基础操作
Django基础操作 django常用命令 创建django项目 django-admin startproject mysite 创建项目完成以后,文件目录结构为: 修改settings文件内容 A ...
- 前端面试绝对会考的JS问题!【已经开源】
写在前面 [前端指南]前端面试库已经开源,正在完善之中 [x] css问题 [x] html问题 [x] javascript问题 github地址 https://github.com/nanhup ...
- 前端基础之JavaScript_1
摘要: JavaScript简介 引入方式 语言规范 JavaScript语言基础 变量声明 数据类型 运算符 流程控制 函数 词法分析 内置对象 一.JavaScript概述 1.ECMAScrip ...
- react 语法细节总结说明
1.当要获取某个数据列表中的某个字段时,用“.”附加的形式.例如:获取user中的balance字段,用this.props.user.balance 来表示. 2.当要打印某个数据或字段结果时,co ...
- java中String数组和List的互相转化
1.List转String数组 方法一: //先准备一个List List<String> testList=new ArrayList<>(); testList.add(& ...
- Codeforces Round #386 (Div. 2) A+B+C+D!
A. Compote 水题(数据范围小都是水题),按照比例找最小的就行了,3min水过. int main() { int a,b,c; while(~scanf("%d%d%d" ...
- nginx配置文件解答
nginx配置文件详解: server { listen 80; servername www.nginx1.com location / { root ...
- MyEclipse 6.5安装maven插件
一.卸载原有maven插件 MyEclipse 6.5集成了Maven插件,不过有不少bug,用习惯了m2eclipse,不想在这上面浪费时间.要安装m2eclipse,需要先把自带的maven插件卸 ...
- jvm的类加载器,类装载过程
混沌初开,在一片名为jvm的世界中,到处都是一片虚无,直到一个名为BootstrapClassLoader的巨人劈开了世界,据说它是由名叫C++的女神所造,它从一个叫做jre/lib的宝袋中拿出一把开 ...