scala – Spark中的sortByKey

前端之家收集整理的这篇文章主要介绍了scala – Spark中的sortByKey前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Spark和 Scala的新功能.试图对单词计数示例进行排序. My code is based on this simple example.
我想按键按字母顺序对结果进行排序.如果我将密钥排序添加到RDD:

val wordCounts = names.map((_,1)).reduceByKey(_ + _).sortByKey()

然后我得到一个编译错误

error: No implicit view available from java.io.Serializable => Ordered[java.io.Serializable].
[INFO]     val wordCounts = names.map((_,1)).reduceByKey(_ + _).sortByKey()

我不知道缺少隐含视图意味着什么.有人能告诉我如何解决它吗?我正在运行Cloudera 5 Quickstart VM.我认为它捆绑Spark版本0.9.

Scala工作的来源

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

object SparkWordCount {
  def main(args: Array[String]) {
    val sc = new SparkContext(new SparkConf().setAppName("Spark Count"))

    val files = sc.textFile(args(0)).map(_.split(","))

    def f(x:Array[String]) = {
      if (x.length > 3)
        x(3)
      else
        Array("NO NAME")
   }

    val names = files.map(f)

    val wordCounts = names.map((_,1)).reduceByKey(_ + _).sortByKey()

    System.out.println(wordCounts.collect().mkString("\n"))
  }
}

一些(未排序)输出

("INTERNATIONAL EYELETS INC",879)
("SHAQUITA SALLEY",865)
("PAZ DURIGA",791)
("TERESSA ALCARAZ",824)
("MING CHAIX",878)
("JACKSON SHIELDS YEISER",837)
("AUDRY HULLINGER",875)
("GABRIELLE MOLANDS",802)
("TAM TACKER",775)
("HYACINTH VITELA",837)

解决方法

没有隐式视图意味着没有像这样定义的scala函数

implicit def SerializableToOrdered(x :java.io.Serializable) = new Ordered[java.io.Serializable](x) //note this function doesn't work

出现此错误的原因是因为在您的函数中,您将返回两种不同类型的超类型java.io.Serializable(其中一个是String,另一个是Array [String]).另外,由于显而易见的原因,reduceByKey要求密钥为Orderable.像这样解决

object SparkWordCount {
  def main(args: Array[String]) {
    val sc = new SparkContext(new SparkConf().setAppName("Spark Count"))

    val files = sc.textFile(args(0)).map(_.split(","))

    def f(x:Array[String]) = {
      if (x.length > 3)
        x(3)
      else
        "NO NAME"
    }

    val names = files.map(f)

    val wordCounts = names.map((_,1)).reduceByKey(_ + _).sortByKey()

    System.out.println(wordCounts.collect().mkString("\n"))
  }
}

现在该函数只返回Strings而不是两种不同的类型

猜你在找的Scala相关文章