2016-10-30 3 views
0

私はこの回答をlinkで解決しましたが、もっと具体的なニーズがあります。Spark DataFrame内の特定の列のみを処理する必要があります

「cat」で始まる列のみを選択する必要があります。私は、パターンに基づいて列を選択する方法を決定することができません。私はデータフレームをフィルタリングする必要はありません。パターンで始まる名前の列だけを選択してください。

org.apache.spark.sql.AnalysisException:

val transformers: Array[PipelineStage] = df.select("cat*").columns.map(
    cname => 
    new StringIndexer() 
     .setInputCol(cname) 
     .setOutputCol(s"${cname}_index") 
) 

val stages: Array[PipelineStage] = transformers 

val pipeline = new Pipeline().setStages(stages) 
val model = pipeline.fit(df) 

このコードは、エラーを生成する[CAT3、CAT7、cat25、...

答えて

0

なぜ列を取得するためにデータフレームから選択していますか?なぜすべての名前にフィルタをかけるだけではありません:

val transformers: Array[PipelineStage] = df.columns.filter(_.startsWith("cat")).map(
    cname => 
    new StringIndexer() 
     .setInputCol(cname) 
     .setOutputCol(s"${cname}_index") 
) 
1
: '猫*' 与えられた入力列を解決することはできません

これは簡単です。以下のように「cat」で始まる列にフィルタをかけるだけです:

val transformers: Array[PipelineStage] = df.select("cat*").columns.filter(_.startsWith("cat")).map(
      cname => 
      new StringIndexer() 
       .setInputCol(cname) 
       .setOutputCol(s"${cname}_index") 
    ) 
+0

私は私の電話にいます。 – eliasah

+0

私は、文書のように列の代わりに行にフィルター行為があるように見えることは確かではありませんでした。私はそれを試してみましょう。ありがとう! –

+0

コードを解体すると、columnsメソッドは、(RDDで使用するものに似ていますが、同じではなく)フィルタを適用してマップを返します。 – eliasah

関連する問題