我有两个Seqs,我想用它们将列添加到dataframe中。
序列号是这样的:Seq("red", "blue", "green", "yellow", "violet")
Sequo2类似于:Seq("child", "teen", "adult", "senior")
我还有一个列,它是一个字符串,其格式为: s"$color+$age- score =$score",包含颜色和年龄的每种组合,以及结果分数,因此20个不同的颜色年龄分数。
目前,我正在做类似这样的事情
finalDF.withColumn("red_child", getScore("red", "child"))
.withColumn("red_teen", getScore("red", "teen"))
.withColumn("red_adult", getScore("red", "adult"))
以此类推,对于所有20种可能的组合,getScore是一个处理正则表达式的辅助函数。
因为我使用了20次withColumn,所以代码很难读懂。我想知道是否有任何方法可以让这段代码看起来更干净,使用颜色和年龄的两个Seqs循环并将列添加到dataframe中。
谢谢。
发布于 2019-06-19 09:04:41
您可以简单地select
从使用for-comprehension
生成的元组列表派生的其他列,如下所示:
val colors = Seq("red", "blue", "green", "yellow", "violet")
val ageGroups = Seq("child", "teen", "adult", "senior")
val colPairs = for { c <- colors; a <- ageGroups } yield (c, a)
def getScore(c: String, a: String): Column = ???
df.select( df.columns.map(col) ++ colPairs.map{ case (c, a) =>
getScore(c, a).as(c + "_" + a)
}: _*
)
或者,使用foldLeft
遍历colPairs列表以通过withColumn
添加列
colPairs.foldLeft(df){ case (accDF, (c, a)) =>
accDF.withColumn(c + "_" + a, getScore(c, a))
}
https://stackoverflow.com/questions/56657794
复制相似问题