如何将 spark 数据帧的列移动到同一数据帧中的嵌套列?

问题描述

我将 spark 数据帧的列移动到同一数据帧内的嵌套列的方法是这样的:

    .appName("SparkByExamples.com")
    .master("local")
    .getorCreate()

  import spark.sqlContext.implicits._

  val data = Seq(("Adam","111","50000"),("Abe","222","60000"),("Sam","333","40000"))

  var df = data.toDF("Name","EmpId__c","Salary__c")
  df.show(false)

  val cstColsSeq = df.columns.filter(c => c.endsWith("__c")).map(f => { col(f) }).toSeq
  var cstMapCol: Column = org.apache.spark.sql.functions.struct(cstColsSeq)
  df = df.withColumn("cstMap",cstMapCol)

问题是我无法向 org.apache.spark.sql.functions.struct(...) 调用提供 Seq[Column]。它只接受一个 Column* 参数。

后续是做这样的事情:

for (i <- cstColsList) {
    cstMapCol = org.apache.spark.sql.functions.struct(i)
    df = df.withColumn("cstMap",cstMapCol)
}

然而,这会覆盖 cstMap

有什么想法我如何向结构提供 cstColsSeq 吗?也欢迎其他解决方案,这些解决方案可能采用不同的方法在现有填充数据框中添加嵌套列。

谢谢!

解决方法

您可以使用 pwsh -c " ""ab c"".length " 表示法扩展 Seq

: _*

这将给出输出

var cstMapCol: Column = org.apache.spark.sql.functions.struct(cstColsSeq: _*)