我有一个Dataframe,它的列数是可变的,比如col1,col2,col3。我需要使用下面的代码将col1和col2组合成一列数据类型Map。
val df_converted = df.withColumn("ConvertedCols", map(lit("Col1"), col("Col1"), lit("Col2"), col("Col2")))
但是,当我不知道列的数目和名称时,我怎么能对所有列都这样做呢?
iyr7buue1#
一种方法是通过 flatMap 变成一个 Seq(lit(c1), col(c1), lit(c2), col(c2), ...) 并应用sparkMap,如下所示:
flatMap
Seq(lit(c1), col(c1), lit(c2), col(c2), ...)
import org.apache.spark.sql.functions._ import spark.implicits._ val df = Seq( ("a", "b", "c", "d"), ("e", "f", "g", "h") ).toDF("c1", "c2", "c3", "c4") val kvCols = df.columns.flatMap(c => Seq(lit(c), col(c))) df.withColumn("ConvertedCols", map(kvCols: _*)).show(false) // +---+---+---+---+---------------------------------------+ // |c1 |c2 |c3 |c4 |ConvertedCols | // +---+---+---+---+---------------------------------------+ // |a |b |c |d |Map(c1 -> a, c2 -> b, c3 -> c, c4 -> d)| // |e |f |g |h |Map(c1 -> e, c2 -> f, c3 -> g, c4 -> h)| // +---+---+---+---+---------------------------------------+
1条答案
按热度按时间iyr7buue1#
一种方法是通过
flatMap
变成一个Seq(lit(c1), col(c1), lit(c2), col(c2), ...)
并应用sparkMap,如下所示: