2017-02-07 6 views
1

У меня есть этот обычай Scala объект (в основном Java POJO):Фильтрация РДД с CustomObject, Тип Несовпадение

object CustomObject { 

    implicit object Mapper extends JavaBeanColumnMapper[CustomObject] 

} 


class CustomObject extends Serializable { 


    @BeanProperty 
    var amount: Option[java.lang.Double] = _ 

    ... 
} 

В моем главном классе, я загружен РД, содержащий эти CustomObjects. Я пытаюсь фильтровать их и создать новую RDD, содержащий только те объекты, которые имеют значение> 5000.

val customObjectRDD = sc.objectFile[CustomObject]("objectFiles") 
val filteredRdd = customObjectRDD.filter(x => x.amount > 5000) 
println(filteredRdd.count()) 

Однако, мой редактор говорит

Тип Несовпадение: Ожидаемое: (CustomObject) = > Boolean, Actual: (CustomObject) => Любые

Что я должен сделать, чтобы получить эту работу?

ответ

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 должен провалить предикат фильтра. См. the docs для определения Option.exists.

 Смежные вопросы

  • Нет связанных вопросов^_^