Spark Error Running" stats()":无法找到参数num的隐含值:数字[Double]

时间:2017-06-07 16:17:11

标签: scala apache-spark

我在写了一些MapReduce工作后学习了spark / scala。

我写了一些java bean来帮助我解析HDFS中的文件,我想用它来帮助加快我在spark中的进度。

我已经成功加载了我的文件并创建了一个java bean对象数组:

val input = sc.textFile("hdfs://host:port/user/test/path/out")
import my.package.Record
val clust_recs = clv_input.map(line => new my.package.Record(line))
clust_recs.map(rec => rec.getPremium()).stats()

但最后一行会产生此错误:

<console>:46: error: could not find implicit value for parameter num: Numeric[Double]

我已经测试过这个字段中的值都是有效的,所以我很确定我没有任何可能导致此错误的空值。

以下是值的示例:

val dblArray = clust_recs.map(rec => rec.getPremium()).filter(!isNaN(_))
dblArray.take(10)

输出:

res82: Array[Double] = Array(1250.6, 433.72, 567.07, 219.24, 310.32, 2173.48, 195.0, 697.94, 711.46, 42.718050000000005)

我不知道如何解决这个错误,并想知道我是否应该放弃使用我已经创建的JavaBean对象的概念。

2 个答案:

答案 0 :(得分:0)

stats隐式转化为RDD[T]RDD[Double]RDD[T]只能将T转换为Numeric[T] (见the code):

implicit def doubleRDDToDoubleRDDFunctions(rdd: RDD[Double]): DoubleRDDFunctions = {
  new DoubleRDDFunctions(rdd)
}

implicit def numericRDDToDoubleRDDFunctions[T](rdd: RDD[T])(implicit num: Numeric[T])
  : DoubleRDDFunctions = {
  new DoubleRDDFunctions(rdd.map(x => num.toDouble(x)))
}

隐式转换也在DoubleRDDFunctions

的标量中提到
  

通过隐式转换在双打的RDD上可用的额外功能。

重点是以下行不会为您提供RDD[Double],但其他

clust_recs.map(rec => rec.getPremium())

这就是出现以下编译错误的原因:

  

错误:无法找到参数num的隐含值:数字[双精度]

Scala编译器找不到名为Numeric[Double]的{​​{1}}隐式转换。

num

我只能猜测 implicit def numericRDDToDoubleRDDFunctions[T](rdd: RDD[T])(implicit num: Numeric[T]) : DoubleRDDFunctions = { new DoubleRDDFunctions(rdd.map(x => num.toDouble(x))) } 是Java的Double而不是Scala的java.lang.Double因此编译错误。

答案 1 :(得分:0)

感谢让Jacek朝着正确的方向前进,你的回答让我更多地了解如何在地图函数中将java.lang.Double转换为scala.Double。

作为scala的新用户,我很难掌握与Java的差异,尤其是隐式转换。

我发现此帖非常有用:http://www.scala-archive.org/scala-Double-td1939353.html

并最终将代码更改为:

<button (click)="onSave()" md-button>Save</button>

输出:

clust_recs.map(rec => rec.getPremium().doubleValue()).stats()