43.top10热门品类之使用Scala实现二次排序

本文为《Spark大型电商项目实战》 系列文章之一,主要介绍使用Scala实现二次排序。

代码实现

在Scala IDE中的包com.erik.sparkproject中创建SortKey.scala,实现二次排序,代码如下:

package com.erik.sparkproject

/**
 * @author Erik
 */
class SortKey(val clickCount: Int, 
    val orderCount: Int, 
    val payCount: Int)
    extends Ordered[SortKey] with Serializable {

  def compare(that: SortKey): Int = {
    if(clickCount - that.clickCount != 0) {
      clickCount - that.clickCount
    } else if(orderCount - that.orderCount != 0) {
      orderCount - that.orderCount 
    } else if(payCount - that.payCount != 0) {
      payCount - that.payCount
    } else {
      0
    }
  }
}

测试

对实现的二次排序方法进行测试,新建SortKeyTest.scala,代码如下:

package com.erik.sparkproject

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext


/**
 * @author Erik
 */
object SortKeyTest {

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("SortKeyTest")  
        .setMaster("local")  
    val sc = new SparkContext(conf) 

    val arr = Array(Tuple2(new SortKey(30, 35, 40), "1"),
        Tuple2(new SortKey(35, 30, 40), "2"),
        Tuple2(new SortKey(30, 38, 30), "3"))  
    val rdd = sc.parallelize(arr, 1)  

    val sortedRdd = rdd.sortByKey(false)

    for(tuple <- sortedRdd.collect()) {
      println(tuple._2)  
    }
  }

}

如果运行后结果为2 3 1,则说明测试通过。

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

实现统计热门品类top10,可以按照以下步骤进行: 1. 从数据源中读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息。 2. 根据商品所属品类进行分组,将同一品类的商品放到一起。 3. 统计每个品类下的商品数量,得到每个品类的商品总数。 4. 对每个品类下的商品数量进行排序,得到每个品类的商品数量排名。 5. 取出数量排名前10的品类,即为热门品类top10Scala代码示例: ```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、付费专栏及课程。

余额充值