web-dev-qa-db-ja.com

Fetch Sparkデータフレーム列リスト

sparkデータフレームのすべての列名をSeq変数に取得する方法。

入力データとスキーマ

val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")

dataset1.printSchema()
root
|-- KEY1: string (nullable = true)
|-- KEY2: string (nullable = true)
|-- ID: string (nullable = true)

scala programmingを使用してすべての列名を変数に保存する必要があります。以下のように試しましたが、機能しません。

val selectColumns = dataset1.schema.fields.toSeq

selectColumns: Seq[org.Apache.spark.sql.types.StructField] = WrappedArray(StructField(KEY1,StringType,true),StructField(KEY2,StringType,true),StructField(ID,StringType,true))

期待される出力:

val selectColumns = Seq(
  col("KEY1"),
  col("KEY2"),
  col("ID")
)

selectColumns: Seq[org.Apache.spark.sql.Column] = List(KEY1, KEY2, ID)
11
RaAm

次のコマンドを使用できます。

val selectColumns = dataset1.columns.toSeq

scala> val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")
dataset1: org.Apache.spark.sql.DataFrame = [KEY1: string, KEY2: string ... 1 more field]

scala> val selectColumns = dataset1.columns.toSeq
selectColumns: Seq[String] = WrappedArray(KEY1, KEY2, ID)
14
Yaron
val selectColumns = dataset1.columns.toList.map(col(_))
7
RaAm

私はそのように列プロパティを使用します

val cols = dataset1.columns.toSeq

そして、後で先頭から末尾までの順序ですべての列を選択する場合は、使用できます

val orderedDF = dataset1.select(cols.head, cols.tail:_ *)
3
uh_big_mike_boi

次の方法で、データセット/テーブルの列名をシーケンス変数に取得できます。

データセットから、

val col_seq:Seq[String] = dataset.columns.toSeq

テーブルから、

val col_seq:Seq[String] = spark.table("tablename").columns.toSeq
                           or
val col_seq:Seq[String] = spark.catalog.listColumns("tablename").select('name).collect.map(col=>col.toString).toSeq
1
Krishna Reddy