我有一个dataframe
syr | P1 | P2
-----------------
1 | 200 | 300
2 | 500 | 700
3 | 900 | 400
我想创建另一个具有最大值col2
&col3
。预期的输出大约是:
syr | P1 | P2 | max
-------------------------
1 | 200 | 300 | 300
2 | 500 | 700 | 700
3 | 900 | 400 | 900
您可以定义一个新的UDF函数以捕获两个列之间的最大值,例如:
def maxDef(p1: Int, p2: Int): Int = if(p1>p2) p1 else p2
val max = udf[Int, Int, Int](maxDef)
然后将UDF应用于withColumn()
中以定义新列,例如:
val df1 = df.withColumn("max", max(df.col("P1"), df.col("P2")))
+---+---+---+---+
|syr| P1| P2|max|
+---+---+---+---+
| 1|200|300|300|
| 2|500|700|700|
| 3|900|400|900|
+---+---+---+---+
编辑:通过列迭代
首先初始化max
列:
df = df.withColumn("max", lit(0))
然后您想要的foreach列(使用filter
功能属性)将其与max
列进行比较。
df.columns.filter(_.startsWith("P")).foreach(col => {
df = df.withColumn("max", max(df.col("max"), df.col(col)))
})