使用CustomObject过滤RDD,类型不匹配

时间:2017-02-07 19:16:51

标签: scala apache-spark rdd

我有这个自定义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)=>任何

我需要做些什么才能让它发挥作用?

1 个答案:

答案 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