2016-12-12 2 views
0

Je suis curieux de savoir comment filtrer les éléments d'un tableau dans Scala par classe.Scala éléments de filtre flatMap dans l'instance de tableau de type

case class FooBarGG(foo: Int, bar: String, baz: Option[String]) 
val df = Seq((1, "first", "A"), (1, "second", "A"), 
    (2, "noValidFormat", "B"), 
    (1, "lastAssumingSameDate", "C")) 
    .toDF("foo", "bar", "baz") 
    .as[FooBarGG] 
    .drop("replace") 

    val labelEncoder = multiLabelIndexer(columnsFactor) 
    val pipe = new Pipeline().setStages(labelEncoder) 
    val fitted = pipe.fit(df) 

    def multiLabelIndexer(factorCols: Seq[String]): Array[StringIndexer] = { 
    factorCols.map(
     cName => new StringIndexer() 
     .setInputCol(cName) 
     .setOutputCol(s"${cName}_index") 
    ) 
    .toArray 
    } 

Impossible d'obtenir flatMap à travailler, comme Transformer et non StringIndexerModel devrait.

stages flatMap { 
    //  case _.isInstanceOf[StringIndexerModel] => Some(_)//Some(_.asInstanceOf[StringIndexerModel]) 
    case StringIndexerModel => Some(_) 
    case _ => None 
    } 

Mon approche est basée sur Filtering a Scala List by type

Répondre

3

COLLECT

Collect est beaucoup plus claire et élégante

stages collect { case a: StringIndexerModel => a } 

En cas de collect vous n'avez pas besoin de retourner Some et None valeurs, au lieu suffit de choisir celui que vous avez besoin et ignorer les autres cas, c'est la raison pour laquelle la collecte est plus élégante.

De même, isInstanceOf est redondant et prolixe lorsque vous utilisez la correspondance de modèle car la correspondance de modèle peut être utilisée pour déterminer les types externes.

Par exemple

val list = List(1, 2, 3) 

list match { 
    case a: List => //no need to use isInstanceOf 
    case _ => 
} 

Remarquez que nous ne pouvons déterminer le type de liste, mais ne peut pas comprendre la liste [Int] en raison de l'effacement de type

0

l'aide d'un paramètre nommé et ne correspond pas à tout type est la solution.

case c: StringIndexerModel => Some(c) 
case _ => None