2017-01-29 1 views

答えて

5

データ型に基づいて特定の列をドロップする場合は、以下のスニペットが役立ちます。この例では、String型とInt型の2つのフィールドを持つデータフレームがあります。私は、スキーマからフィールド(String型のすべてのフィールドが削除されます)のフィールドを削除しています。

import sqlContext.implicits._ 

val df = sc.parallelize(('a' to 'l').map(_.toString) zip (1 to 10)).toDF("c1","c2") 

val fields = df.schema.fields filter { 
x => x.dataType match { 
     case x: org.apache.spark.sql.types.StringType => true 
     case _ => false 
     } 
    } map { x => x.name } 

val newDf = fields.foldLeft(df){ case(dframe,field) => dframe.drop(field) } 

newDfのスキーマは、ここでorg.apache.spark.sql.DataFrame = [c2: int]

+0

ねえ、これは素晴らしいです。私はケースの構造が好きだった。オフトピックでは、関数 "df.schema.fields filter"を一般的な方法で使うことができ、foldLeftは何をしているのか説明できますか? –

1

あるScalaでは空想の方法です:

var categoricalFeatColNames = df.schema.fields filter { _.dataType.isInstanceOf[org.apache.spark.sql.types.StringType] } map { _.name }