val finalRDD = joinedRDD.map(x => {
val d1 = x._2._1
val d2 = x._2._2
(x._1, d1 + d2)
})
在上面的代码中,joinedRDD
的类型为RDD[(Row, (Double, Double))]
(根据IntelliJ),而Scala编译器则说d1
& d2
是AnyVal
。
我暂时投了d1
&使用d2
Double
为asInstanceOf
,但下次说明
java.lang.ClassCastException:java.lang.Integer无法强制转换为 java.lang.Double中
Scala编译器问题或IntelliJ问题是否显示错误的推断类型。任何见解?
答案 0 :(得分:3)
对我来说似乎很好:-S 类型推断远非无所不知。有时您需要明确指定类型。根据我的经验,当结果类型可以是任何东西时尤其如此。有些事要尝试:
joinedRDD.mapValues(x => x._1 + x._2)
val d1: Double = x._2._1
。幸运的是,至少编译器可能更明确。 map(myFunc)
另外,我看到IntelliJ Scala插件和实际的Scala编译器之间存在一些差异。鉴于你得到的错误以及AnyVal是Int和Double的公共父类的事实,你很可能没有双打开始(并且编译器试图找到共享父级)。通过明确说明,仔细检查您是否获得了您提到的类型。您的类型混淆很可能发生在此行之前。
祝你好运!答案 1 :(得分:2)
好吧,我在IntelliJ IDEA 14中尝试过并且类型推断是正确的,将d1和d2识别为Double
(这是预期的)。尽管如此,我通常会避免IDEA的类型感知突出显示功能,因为很多时候它会变得疯狂并报告假结果。
作为旁注,由于您没有更改RDD的密钥,请考虑使用mapValues
代替map
(这样可以提供清晰度和性能,因为它可以利用分区程序输入RDD并在输出RDD中重用它。