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

How do I move a spark dataframe's columns to a nested column in the same dataframe?

我将 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 的任何想法?也对其他解决方案开放,这些解决方案可能采用不同的方法在现有填充数据框中添加嵌套列。

谢谢!

您可以使用 : _* 符号扩展 Seq

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

这将给出输出

df.withColumn("cstMap", cstMapCol).show
+----+--------+---------+------------+
|Name|EmpId__c|Salary__c|      cstMap|
+----+--------+---------+------------+
|Adam|     111|    50000|[111, 50000]|
| Abe|     222|    60000|[222, 60000]|
| Sam|     333|    40000|[333, 40000]|
+----+--------+---------+------------+