如何将sparkDataframe的列移动到同一Dataframe中的嵌套列?

mpbci0fu  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(371)

我将sparkDataframe的列移动到同一Dataframe中的嵌套列的方法如下:

.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]。它只接受列*param。
接下来要做的就是这样:

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

但是,这会覆盖 cstMap 我该如何向结构提供cstcolsseq?其他解决方案也可以采用不同的方法在现有填充的数据框中添加嵌套列。
谢谢!

zazmityj

zazmityj1#

您可以扩展 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]|
+----+--------+---------+------------+

相关问题