我将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)
问题是,我不能提供一个Seq[Column] org.apache.spark.sql.functions.struct(…)调用。它只接受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]|
+----+--------+---------+------------+