如何将Spark DataFrame列嵌入地图列



我有一个带有许多列的火花数据框架。现在,我想将它们结合在一起并构建新列。例如

col1:String col2:String col3:String... coln:String =>
col: Map(colname -> colval)

这样做的一种方法是:

df.withColumn("newcol", struct(df.columns.head, df.columns.tail: _*))

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

另一个选项是嵌入列以映射类型,但我不知道如何表达它。

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

org.apache.spark.sql.functions.map

这是一个完整的示例:

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:_*)))

导致这样做:

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"}

如果要从所有现有列构建新列,这是一个简单的解决方案。

import org.apache.spark.sql.functions._
val columnsName = ds.columns
val mkMap = udf((values: mutable.WrappedArray[Int]) => columnsName.zip(values).toMap)
ds.withColumn("new_col", mkMap(array(columnsName.head, columnsName.tail:_*)))

相关内容

  • 没有找到相关文章

最新更新