36.top10热门品类之获取session访问过的所有品类

本文为《Spark大型电商项目实战》 系列文章之一,主要代码实现top10热门品类模块中的第一步:获取符合条件的session访问过的所有品类。

代码实现

UserVisitSessionAnalyzeSpark.java中实现获取top热门品类的功能。
sc.close();前面添加获取Top10热门品类方法,代码及注释如下:

//获取top10热门品类
        List<Tuple2<CategorySortKey, String>> top10CategoryList = 
                getTop10Category(task.getTaskid(), sessionid2detailRDD);

然后在”计算各session范围占比,并写入MySQL”方法后面实现“获取top10热门品类”方法

/**
     * 获取Top10热门品类
     * @param filteredSessionid2AggrInfoRDD
     * @param sessionid2actionRDD
     */
    private static void getTop10Category(
            JavaPairRDD<String, String> filteredSessionid2AggrInfoRDD,
            JavaPairRDD<String, Row> sessionid2actionRDD) {

        /**
         * 第一步:获取符合条件的session访问过的所有品类
         */

        //获取符合条件的session的访问明细
        JavaPairRDD<String, Row> sessionid2detailRDD = filteredSessionid2AggrInfoRDD
                .join(sessionid2actionRDD)
                .mapToPair(new PairFunction<Tuple2<String, Tuple2<String, Row>>, String, Row>() {

                    private static final long serialVersionUID = 1L;

                    public Tuple2<String, Row> call(
                            Tuple2<String, Tuple2<String, Row>> tuple) throws Exception {
                        return new Tuple2<String, Row>(tuple._1, tuple._2._2);
                    }

                });

        //获取session访问过的所有品类id
        //访问过指的是点击、下单、支付的品类
        JavaPairRDD<Long, Long> CategoryidRDD = sessionid2detailRDD.flatMapToPair(
                new PairFlatMapFunction<Tuple2<String, Row>, Long, Long>() {

                    private static final long serialVersionUID = 1L;

                    public Iterable<Tuple2<Long, Long>> call(
                            Tuple2<String, Row> tuple) throws Exception {

                        Row row = tuple._2;

                        List<Tuple2<Long, Long>> list = new ArrayList<Tuple2<Long, Long>>();
                        Long clickCategoryId = row.getLong(6);
                        if(clickCategoryId != null) {
                            list.add(new Tuple2<Long ,Long>(clickCategoryId, clickCategoryId));
                        }

                        String orderCategoryIds = row.getString(8);
                        if(orderCategoryIds != null) {
                            String[] orderCategoryIdsSplited = orderCategoryIds.split(",");
                            for(String orderCategoryId : orderCategoryIdsSplited) {
                                list.add(new Tuple2<Long, Long>(Long.valueOf(orderCategoryId), 
                                        Long.valueOf(orderCategoryId)));
                            }
                        }

                        String payCategoryIds = row.getString(10);
                        if(payCategoryIds != null) {
                            String[] payCategoryIdsSplited = payCategoryIds.split(",");
                            for(String payCategoryId : payCategoryIdsSplited) {
                                list.add(new Tuple2<Long, Long>(Long.valueOf(payCategoryId),
                                        Long.valueOf(payCategoryId)));
                            }
                        }

                        return list;
                    }

                });

        //必须去重
        //如果不去重的话,会出现重复的categoryid,排序会对重复的categoryid以及countInfo进行排序
        //最后很可能会拿到重复的数据
        categoryidRDD = categoryidRDD.distinct();

《Spark 大型电商项目实战》源码:https://github.com/Erik-ly/SprakProject

本文为《Spark大型电商项目实战》系列文章之一,
更多文章:Spark大型电商项目实战:http://blog.csdn.net/u012318074/article/category/6744423

要实现统计热门品类top10,可以按照以下步骤进行: 1. 从数据源中读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息。 2. 根据商品所属品类进行分组,将同一品类的商品放到一起。 3. 统计每个品类下的商品数量,得到每个品类的商品总数。 4. 对每个品类下的商品数量进行排序,得到每个品类的商品数量排名。 5. 取出数量排名前10的品类,即为热门品类top10。 Scala代码示例: ```scala // 从数据源中读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息 val products = Seq( ("p1", "商品1", "品类1"), ("p2", "商品2", "品类2"), ("p3", "商品3", "品类1"), ("p4", "商品4", "品类2"), ("p5", "商品5", "品类1"), ("p6", "商品6", "品类3"), ("p7", "商品7", "品类2"), ("p8", "商品8", "品类1"), ("p9", "商品9", "品类2"), ("p10", "商品10", "品类3"), ("p11", "商品11", "品类1"), ("p12", "商品12", "品类2"), ("p13", "商品13", "品类3"), ("p14", "商品14", "品类1"), ("p15", "商品15", "品类2") ) // 根据商品所属品类进行分组,将同一品类的商品放到一起 val productsByCategory = products.groupBy(_._3) // 统计每个品类下的商品数量,得到每个品类的商品总数 val productsCountByCategory = productsByCategory.mapValues(_.size) // 对每个品类下的商品数量进行排序,得到每个品类的商品数量排名 val categoryCountRank = productsCountByCategory.toSeq.sortBy(-_._2).zipWithIndex // 取出数量排名前10的品类,即为热门品类top10 val top10Categories = categoryCountRank.take(10).map(_._1._1) // 打印结果 println("热门品类top10:") top10Categories.foreach(println) ``` 输出结果: ``` 热门品类top10: 品类1 品类2 品类3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值