电商用户行为分析大数据平台(五)-- 获取top10品类的点击次数最多的10个session

一、需求分析
----------------------------------
    1.已知数据
        top10热门品类
    2.目的
        获取每个top10品类点击次数最多的10个session,以及其对应的访问明细

二、思路分析
--------------------------------------
    1.拿到符合筛选条件的session的明细数据
    2.按照session粒度进行聚合,获取到session对每个品类的点击次数,用flatMap,算子函数返回的是<categoryid,(sessionid,clickCount)>
    3.按照品类id,分组取top10,获取到top10活跃session;groupByKey;自己写算法,获取到点击次数最多的前10个session,直接写入MySQL表;返回的是sessionid
    4.获取各品类top10活跃session的访问明细数据,写入MySQL
    5.本地测试


三、具体步骤
---------------------------------------
    1.根据之前的top10热门品类的id,生成一份RDD  top10CategoryIdRDD <top10categoryid, top10categoryid>

    2.获取top10品类的,每个session的点击次数
        a.获取每个session对应的访问行为明细row <sessionid,[rows]> sessionid2detailsRDD
            JavaPairRDD<String, Iterable<Row>> sessionid2detailsRDD = sessionid2detailRDD.groupByKey();

        b.获取每个session中,点击的品类及其次数 <categoryid, sessionid+clickcount> categoryid2sessionCountRDD
            JavaPairRDD<Long, String> categoryid2sessionCountRDD = sessionid2detailsRDD.flatMapToPair(...)

        c.获取到to10热门品类,被各个session点击的次数<categoryid, sessionid+clickcount> top10CategorySessionCountRDD
            JavaPairRDD<Long, String> top10CategorySessionCountRDD = top10CategoryIdRDD.join(categoryid2sessionCountRDD).mapToPair(...);

        d.分组取TopN算法获取top10活跃session
            //以categoryid进行分组,得到<categoryid, Iterable[sessionid+clickcount]> top10CategorySessionCountsRDD
            JavaPairRDD<Long, Iterable<String>> top10CategorySessionCountsRDD = top10CategorySessionCountRDD.groupByKey();

            //TopN算法实现,获取每个品类的top10活跃用户
            JavaPairRDD<String, String> top10SessionRDD = top10CategorySessionCountsRDD.flatMapToPair(...//Top10算法...)

            //获取top10活跃session的明细数据,并写入MySQL
            JavaPairRDD<String, Tuple2<String, Row>> sessionDetailRDD = top10SessionRDD.join(sessionid2detailRDD);

        e.top10排序算法
            // 遍历排序数组
            for(int i = 0; i < top10Sessions.length; i++) {
                // 如果当前i位,没有数据,那么直接将i位数据赋值为当前sessionCount
                if(top10Sessions[i] == null) {
                    top10Sessions[i] = sessionCount;
                    break;
                } else {
                    long _count = Long.valueOf(top10Sessions[i].split(",")[1]);

                    // 如果sessionCount比i位的sessionCount要大
                    if(count > _count) {
                        // 从排序数组最后一位开始,到i位,所有数据往后挪一位
                        for(int j = 9; j > i; j--) {
                            top10Sessions[j] = top10Sessions[j - 1];
                        }
                        // 将i位赋值为sessionCount
                        top10Sessions[i] = sessionCount;
                        break;
                    }

                    // 比较小,继续外层for循环
                }
            }



猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/86530196