【问题标题】:sortByKey in SparkSpark 中的 sortByKey
【发布时间】:2014-06-11 03:26:12
【问题描述】:

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)

【问题讨论】:

  • 没有隐式视图意味着你还没有定义这两种类型之间的隐式转换函数,至于为什么那些是它抱怨的类型不是 100% 确定的,f 打算的函数是什么做,看起来它正在映射出两种不同的类型

标签: scala apache-spark


【解决方案1】:

没有隐式视图意味着没有定义这样的 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 要求密钥是可订购的。像这样修复它

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"))
  }
}

现在函数只返回字符串而不是两种不同的类型

【讨论】:

  • 谢谢。我不敢相信我做到了。函数 f 只是提取数组的第四个元素(如果存在)——我正在解析一个 CSV 文件。我在使用 Scala 的匿名函数语法时遇到了一点问题,所以我定义了一个函数。
  • @ahoffer 如果你明确定义返回类型,scala 不会尝试推断要返回的类型,错误会更清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多