我在写了一些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对象的概念。
答案 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()