df1.printSchema()
は、列名とそのデータ型を出力します。Scalaのデータ型で列を削除するSpark
df1.drop($"colNames")
は列名で削除されます。
このコマンドをデータ型で削除する方法はありますか?
df1.printSchema()
は、列名とそのデータ型を出力します。Scalaのデータ型で列を削除するSpark
df1.drop($"colNames")
は列名で削除されます。
このコマンドをデータ型で削除する方法はありますか?
データ型に基づいて特定の列をドロップする場合は、以下のスニペットが役立ちます。この例では、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]
あるScalaでは空想の方法です:
var categoricalFeatColNames = df.schema.fields filter { _.dataType.isInstanceOf[org.apache.spark.sql.types.StringType] } map { _.name }
ねえ、これは素晴らしいです。私はケースの構造が好きだった。オフトピックでは、関数 "df.schema.fields filter"を一般的な方法で使うことができ、foldLeftは何をしているのか説明できますか? –