【问题标题】:Fetch Spark dataframe column list获取 Spark 数据框列列表
【发布时间】:2018-03-26 21:50:00
【问题描述】:

如何将 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)

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    您可以使用以下命令:

    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 - 你想对输出/列名做什么?为什么你需要它是 Columns 类型的?
    • 我需要这个逻辑由中间结果实现。所以我需要列的输出
    【解决方案2】:
    val selectColumns = dataset1.columns.toList.map(col(_))
    

    【讨论】:

      【解决方案3】:

      我像这样使用 columns 属性

      val cols = dataset1.columns.toSeq
      

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

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

      【讨论】:

        【解决方案4】:

        也可以从模式中获取列。

        val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71 ", "d", "4")).toDF("KEY1", "KEY2", "ID") dataset1.printSchema() 根 |-- KEY1:字符串(可为空=真) |-- KEY2:字符串(可为空=真) |-- ID:字符串(可为空=真) 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)

        【讨论】:

          【解决方案5】:

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

          来自数据集,

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-06
            • 1970-01-01
            • 2015-04-03
            • 1970-01-01
            • 1970-01-01
            • 2019-08-29
            相关资源
            最近更新 更多