2016-12-12 9 views
0

スカラ配列の要素をクラスごとにフィルタリングする方法が不思議です。 TransformerないStringIndexerModelが期待されているよう配列のスカラflatMapフィルタ要素タイプ

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 
    } 

は、仕事にflatMapを取得できませんでした。

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

私のアプローチは、名前付きパラメータを使用してFiltering a Scala List by type

答えて

3

使用

Collectを収集する代わりに、ちょうどあなたが必要なものを選択し、はるかに明確かつエレガント

collectの場合
stages collect { case a: StringIndexerModel => a } 

あなたはSomeNone値を返す必要はありませんし、他のケースを無視して、これがコレクションがよりエレガントな理由です。

また、isInstanceOfは、パターンマッチングを使用すると冗長で冗長なので、パターンマッチングを使用して外部タイプを特定できます。例えば

val list = List(1, 2, 3) 

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

我々は唯一のリストとしてのタイプを把握することができますが、

ため、型消去のリスト[のInt]を把握することはできませんお知らせ
0

に基づいており、いずれかのタイプに一致しないことが解決策です。

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