我有这个自定义Scala对象(基本上是Java POJO):
object CustomObject {
implicit object Mapper extends JavaBeanColumnMapper[CustomObject]
}
class CustomObject extends Serializable {
@BeanProperty
var amount: Option[java.lang.Double] = _
...
}
在我的主类中,我加载了一个包含这些CustomObjects的RDD。 我试图过滤它们并创建一个新的RDD,其中只包含金额> gt的对象。 5000。
val customObjectRDD = sc.objectFile[CustomObject]( "objectFiles" )
val filteredRdd = customObjectRDD.filter( x => x.amount > 5000 )
println( filteredRdd.count() )
然而,我的编辑说
类型不匹配:预期:(CustomObject)=>布尔值,实际: (CustomObject)=>任何
我需要做些什么才能让它发挥作用?
答案 0 :(得分:3)
>
未定义Option[Double]
运算符,您的过滤谓词需要处理Option
:
scala> case class A(amount: Option[Double])
defined class A
scala> val myRDD = sc.parallelize(Seq(A(Some(10000d)), A(None), A(Some(5001d)), A(Some(5000d))))
myRDD: org.apache.spark.rdd.RDD[A] = ParallelCollectionRDD[12] at parallelize at <console>:29
scala> myRDD.filter(_.amount.exists(_ > 5000)).foreach{println}
A(Some(10000.0))
A(Some(5001.0))
这假定具有amount = None
的任何对象都应该使过滤谓词失败。有关Option.exists
的定义,请参阅the docs。