首页 > 解决方案 > Spark TopK 如何解决这个问题?

问题描述

我有一个关于 TopK 的问题需要使用 Spark 来解决。

源文件是这样的:

baoshi,13
xinxi,80
baoshi,99
xinxi,32
baoshi,50
xinxi,43
baoshi,210
xinxi,100

这是我的代码:

import org.apache.spark.{SparkConf, SparkContext}

object TopKTest {
  def main(args: Array[String]): Unit = {
    val file = "file:///home/hadoop/rdd-test/TopK3.txt"
    val conf = new SparkConf().setAppName("TopKTest").setMaster("local")
    val sc = new SparkContext(conf)
    val txt = sc.textFile(file)
    val rdd2 =txt.map(line=>(line.split(",")(0)
      ,line.split(",")(1).trim))
    val rdd=rdd2.groupByKey()
    val rdd1 = rdd.map(line=> {
      val f = line._1
      val s = line._2
      val t = s.toList.sortWith(_ > _).take(2)
      (f, t)
})
    rdd1.foreach(println)

  }
}

预期结果是:

(xinxi,List(100, 80))
(baoshi,List(210, 99))

标签: apache-spark

解决方案


那是因为你比较的Strings不是数字。

改变

val rdd2 =txt.map(line=>(line.split(",")(0)
  ,line.split(",")(1).trim))

val rdd2 =txt.map(line=>(line.split(",")(0)
  ,line.split(",")(1).trim.toLong))

推荐阅读