如何将Spark Dataframe列嵌入到Map列?

use*_*587 1 scala apache-spark spark-dataframe apache-spark-dataset

我有一个包含许多列的spark数据框。现在,我想将它们组合到一张地图上并建立一个新列。例如

col1:String col2:String col3:String... coln:String =>
col: Map(colname -> colval)
Run Code Online (Sandbox Code Playgroud)

一种方法是:

df.withColumn("newcol", struct(df.columns.head, df.columns.tail: _*))
Run Code Online (Sandbox Code Playgroud)

但是,我仍然必须将df转换为dataset。我不知道如何在这里定义可以匹配struct类型的案例类。

另一种选择是将列嵌入到Map类型,但是我不知道该如何表达。

Cho*_*ops 6

出于性能原因,可以避免使用现有的 Spark函数滚动自己的UDF :

org.apache.spark.sql.functions.map
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例:

var mydata = Seq(("a", "b", "c"), ("d", "e", "f"), ("g", "h", "i"))
                 .toDF("f1", "f2", "f3")

var colnms_n_vals = mydata.columns.flatMap { c => Array(lit(c), col(c)) }

display(mydata.withColumn("myMap", map(colnms_n_vals:_*)))
Run Code Online (Sandbox Code Playgroud)

结果:

f1  f2  f3  myMap
a   b   c   {"f1":"a","f2":"b","f3":"c"}
d   e   f   {"f1":"d","f2":"e","f3":"f"}
g   h   i   {"f1":"g","f2":"h","f3":"i"}
Run Code Online (Sandbox Code Playgroud)