【问题标题】:Type mismatch, expected ((Double,Double))=>Boolean, actual ((Double,Double))=>Any类型不匹配,预期 ((Double,Double))=>布尔值,实际 ((Double,Double))=>Any
【发布时间】:2016-05-03 20:28:49
【问题描述】:

我有以下两个函数由于3个错误而无法编译:

  1. RegressionMetrics: Cannot resolve constructor
  2. _.nonEmpty:Type mismatch, expected ((Double,Double))=>Boolean, actual ((Double,Double))=>Any

  3. reduce(_+_):Cannot resolve symbol +.

代码:

import org.apache.spark.mllib.evaluation.RegressionMetrics

//..

def getRMSE (rdd: RDD): Double = {
    val metrics = new RegressionMetrics(rdd)
    metrics.rootMeanSquaredError
}

def calculateRMSE(output: DStream[(Double, Double)]): Double = {
    output.filter(_.nonEmpty).map(getRMSE).reduce(_+_)
}

test("Test1") {
// do some data preprocessing
// call the function calculateRMSE
}

知道如何解决这些错误吗?

P.S: 奇怪的是当我把val metrics = new RegressionMetrics(rdd) 放在test 里面时编译没有任何问题。

更新:

我能够通过将(Double,Double) 添加到RDD 来解决问题#1:

  def getRMSE(rdd : RDD[(Double, Double)]) : Double = {
    val metrics = new RegressionMetrics(rdd)
    metrics.rootMeanSquaredError
  }

【问题讨论】:

  • 将此行 `output.filter(.nonEmpty).map(getRMSE).reduce(_+)` 拆分为一系列 val 分配 (val filtered = output.filter(...); val mapped = filtered.map(...); val reduced = mapped.reduce(...)看看类型。我想你会发现它们不是你所期望的。

标签: scala apache-spark


【解决方案1】:

reduce(func): 返回一个新的单元素 RDD 的 DStream 使用 a 聚合源 DStream 的每个 RDD 中的元素 函数 func(接受两个参数并返回一个)。这 函数应该是关联的,以便可以并行计算。

因此,calculateRMSE 的正确签名应该是:

def calculateRMSE(output: DStream[(Double, Double)]): DStream[Double]

【讨论】:

  • 我试过你说的。问题是一样的。查看我的更新,我发布了屏幕截图。
  • 你不能在 double 的元组上调用 nonEmpty,这就是你的截图所说的。你想通过这个过滤实现什么?
  • 我的问题指的是这个帖子中的答案:stackoverflow.com/questions/36984923/… 据我了解,使用filter 我可以过滤掉空 RDD...
猜你喜欢
  • 2021-02-07
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2016-11-21
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多