34-2.Spark大型电商项目-用户访问session分析-session聚合统计之计算统计结果可视化
目录
SessionAggrStatSelectTest.java
jsp目录下----sessionAggrstat.jsp//写的真的很乱
本篇文章将介绍用户访问session分析-session聚合统计之计算统计结果可视化。
代码
(到这相信目录结构已经有印象了,就不详细写了)
ISessionAggrStatDAO.java
/** * 查询session聚合类的统计结果 * @param sessionAggrStat * @return */ Map<String,Object> select(SessionAggrStat sessionAggrStat);
SessionAggrStatDAOImpl.java
/** * session聚合分析可视化 * @param sessionAggrStat * @return 返回一个session访问数最多的一条记录 */ public Map<String,Object> select(SessionAggrStat sessionAggrStat){ String sql = "select * from session_aggr_stat " +" order by session_count desc " +" limit 1"; Map<String,Object> map = new HashMap<String,Object>(); double[] visitLength = new double[9]; double[] visitStep = new double[6]; long[] taskid = new long[1]; long[] sessionCount = new long[1]; Object[] params = new Object[]{}; JDBCHelper jdbcHelper = JDBCHelper.getInstance(); jdbcHelper.executeQuery(sql, params, new JDBCHelper.QueryCallback() { @Override public void process(ResultSet rs) throws Exception { while (rs.next()){ taskid[0] = rs.getLong("task_id"); sessionCount[0] = rs.getLong("session_count"); visitLength[0] = rs.getDouble("1s_3s"); visitLength[1] = rs.getDouble("4s_6s"); visitLength[2] = rs.getDouble("7s_9s"); visitLength[3] = rs.getDouble("10s_30s"); visitLength[4] = rs.getDouble("30s_60s"); visitLength[5] = rs.getDouble("1m_3m"); visitLength[6] = rs.getDouble("3m_10m"); visitLength[7] =rs.getDouble("10m_30m"); visitLength[8]= rs.getDouble("30m"); visitStep[0]= rs.getDouble("1_3"); visitStep[1] = rs.getDouble("4_6"); visitStep[2] = rs.getDouble("7_9"); visitStep[3] = rs.getDouble("10_30"); visitStep[4] = rs.getDouble("30_60"); visitStep[5] = rs.getDouble("60"); } } }); /*System.out.println("visitLength: "+ visitLength.toString()); System.out.println("visitStep: " + visitStep.toString());*/ map.put("taskid",taskid[0]); map.put("sessionCount",sessionCount[0]); map.put("visitLength",visitLength); map.put("visitStep",visitStep); return map; }
ServletSessionAggrStat.java
package graduation.java.servlet; import graduation.java.dao.ISessionAggrStatDAO; import graduation.java.domain.SessionAggrStat; import graduation.java.impl.SessionAggrStatDAOImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; /** * FileName: ServletSessionAggrStat * Author: hadoop * Email: [email protected] * Date: 19-3-18 下午9:37 * Description: * 实现session聚合分析数据的提取,并展示在jsp上 */ @WebServlet(name="ServletSessionAggrStat",value = "/ServletSessionAggrStat") public class ServletSessionAggrStat extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ ISessionAggrStatDAO sessionAggrStatDAO = new SessionAggrStatDAOImpl(); SessionAggrStat sessionAggrStats = new SessionAggrStat(); Map<String,Object> sessionAggrStat; System.out.println("=============================="); sessionAggrStat = sessionAggrStatDAO.select(sessionAggrStats); request.setAttribute("sessionAggrStat", sessionAggrStat); request.getRequestDispatcher("/WEB-INF/jsp/sessionAggrstat.jsp").forward(request, response); } }
SessionAggrStatSelectTest.java
package graduation.java.test; import graduation.java.dao.ISessionAggrStatDAO; import graduation.java.domain.SessionAggrStat; import graduation.java.impl.DAOFactory; import java.util.Map; /** * FileName: SessionAggrStatSelectTest * Author: hadoop * Email: [email protected] * Date: 19-3-18 下午9:07 * Description:测试session聚合数据的单条查询 */ public class SessionAggrStatSelectTest { public static void main(String[] args){ SessionAggrStat sessionAggrStat = new SessionAggrStat(); ISessionAggrStatDAO sessionAggrStatDAO = DAOFactory.getSessionAggrStatDAO(); Map<String,Object> map = sessionAggrStatDAO.select(sessionAggrStat); double[] lenghtArrays = new double[9]; double[] stepArrays = new double[6]; lenghtArrays = (double[]) map.get("visitLength"); stepArrays = (double[]) map.get("visitStep"); long taskid = (long)map.get("taskid"); long sessionCount = (long)map.get("sessionCount"); System.out.println("taskId: "+ taskid); System.out.println("sessionCount: "+ sessionCount); System.out.print("visitLength: "); for (int i = 0; i < lenghtArrays.length; i++){ System.out.print(lenghtArrays[i] + "\t"); } System.out.println(); System.out.print("visitStep: "); for (int i = 0; i < stepArrays.length; i++){ System.out.print(stepArrays[i] + "\t"); } } }
jsp目录下----sessionAggrstat.jsp//写的真的很乱
<%@ page import="java.util.List" %> <%@ page import="graduation.java.domain.Goods" %> <%@ page import="java.util.Arrays" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Map" %> <%@ page import="com.alibaba.fastjson.JSONObject" %><%-- Created by IntelliJ IDEA. User: hadoop Date: 19-3-19 Time: 下午4:19 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% Map<String,Object> map = (Map<String,Object>)request.getAttribute("sessionAggrStat"); long taskid = (long) map.get("taskid"); long sessionCount = (long) map.get("sessionCount"); double[] lengthArrays = (double[])map.get("visitLength"); double[] stepArrays = (double[])map.get("visitStep"); String[] stepname = {"1-3","4-6","7-9","10-30","30-60","60"}; JSONObject step = new JSONObject(); int eachStep = 0; String str = ""; for (int j = 0; j < stepArrays.length;j++){ eachStep = (int)(sessionCount * stepArrays[j]); str += "{value:"+eachStep+", "+ "name:\'"+stepname[j]+"\'},"; step.put(stepname[j],eachStep); } str = str.substring(0,str.length()-1); /* System.out.println("====="+step.toJSONString()); System.out.println("String; "+str); System.out.println("taskId: "+ taskid); System.out.println("sessionCount: "+ sessionCount); System.out.print("visitLength: "); for (int i = 0; i < lengthArrays.length; i++){ System.out.print(lengthArrays[i] + "\t"); } System.out.println(); System.out.print("visitStep: "); for (int i = 0; i < stepArrays.length; i++){ System.out.print(stepArrays[i] + "\t"); }*/ %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户访问Session聚合分析</title> <!-- 引入 echarts.js --> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts-all-3.js"></script> <style> .div-a{ float:left;width:49%;border:0px solid } .div-b{ float:left;width:49%;border:0px solid } .top{width:100%; height:100px; line-height:100px; text-align:center; /*border:1px solid #F00;*/ font-weight:bold; font-size: 30px; } </style> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div class="top">用户访问Session聚合分析</div> <div style="margin-top:50px;margin-left: 40px"> <div id="visitlength" class="div-a" style="width: 600px;height:400px;"></div> <div id="visitstep" class="div-b" style="width: 600px;height:400px;"></div> </div> <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('visitlength')); // 指定图表的配置项和数据 var taskid = <%=taskid%>; var task = " 任务"+taskid; var visitLength = <%=Arrays.toString(lengthArrays)%>; var visitStep = <%=Arrays.toString(stepArrays)%>; var length = ['1s-3s','4s-6s','7s-9s','10s-30s','30s-60s','1m-3m','3m-10m','10m-30','30m']; var step = ['1-3','4-6','7-9','10-30','30-60','60']; var option = { title: { text: '用户访问时长统计', subtext: task }, tooltip: {}, legend: { data:['访问量'] }, xAxis: { data: length, axisLabel : { show:true, interval: 0//, // {number} //rotate: 45, // margin: 8 } }, yAxis: {}, series: [{ name: '访问量', type: 'bar', data: visitLength }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('visitstep')); // 指定图表的配置项和数据 var stepJson =[<%=str%>]; var task = "任务"+taskid; var step = ['1-3','4-6','7-9','10-30','30-60','60']; option = { title : { text: '页面访问步长比例', subtext: task, x:'center' }, tooltip : { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, legend: { orient: 'vertical', left: 'left', data: step }, series : [ { name: '访问来源', type: 'pie', radius : '55%', center: ['50%', '60%'], data:stepJson, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html>