获取Spark dataframe列列表

25
如何将Spark DataFrame中的所有列名获取为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编程将所有列名存储在变量中。 我已尝试以下操作,但未成功。
我需要使用Scala编程将所有列名存储在变量中。 我已尝试以下操作,但未成功。

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)
5个回答

30
您可以使用以下命令:
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)

输出应该是 Seq[org.apache.spark.sql.Column],而不是 List[String]。 - RaAm
@raam - 你想对输出/列名做什么?为什么需要它是Columns类型? - Yaron
我需要将这个逻辑实现在我的中间结果中,因此我需要列的输出。 - RaAm

12
val selectColumns = dataset1.columns.toList.map(col(_))

7
我使用columns属性如下所示。
val cols = dataset1.columns.toSeq

如果您稍后按照从头到尾的顺序选择所有列,则可以使用以下方法:

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

3

这些列也可以从模式中获取。

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)
// 获取选定的列名并存储在数组中 val selectColumns = dataset1.schema.fieldNames selectColumns: Array[String] = Array(KEY1, KEY2, ID)
// 获取选定的列名并存储在序列中 val selectColumns2 = dataset1.schema.fieldNames.toSeq selectColumns2: Seq[String] = WrappedArray(KEY1, KEY2, ID)

3
我们可以通过以下方式将数据集/表的列名获取到一个序列变量中。
从数据集中,
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接