如何将 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]|
+----+--------+---------+------------+
我将 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]|
+----+--------+---------+------------+