提取 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 编程将所有列名存储在变量中。我已经尝试过如下,但它不起作用。

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)

您可以使用以下命令:

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)
val selectColumns = dataset1.columns.toList.map(col(_))

我像这样使用列属性

val cols = dataset1.columns.toSeq

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

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

我们可以通过以下方式将数据集/表的列名放入序列变量中。

从数据集,

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

也可以从架构中获取列。

val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")dataset1.printSchema()根 |-- 键 1:字符串(可为空 = 真) |-- 键 2:字符串(可为空 = 真) |-- ID:字符串(可为空 = 真)val selectColumns = dataset1.schema.fieldNamesselectColumns: Array[String] = Array(KEY1, KEY2, ID)val selectColumns2 = dataset1.schema.fieldNames.toSeqselectColumns2: Seq[String] = WrappedArray(KEY1, KEY2, ID)

相关内容

  • 没有找到相关文章

最新更新