我想找到将100列与数据框进行比较的最大值

时间:2019-03-08 13:33:08

标签: apache-spark-sql hadoop2

我有一个数据框

syr | P1    | P2
-----------------
1   | 200   | 300
2   | 500   | 700
3   | 900   | 400

我想创建另一个DataFrame,其最大值在col2col3之间。预期的输出如下:

syr | P1    | P2    | max
-------------------------
1   | 200   | 300   | 300
2   | 500   | 700   | 700
3   | 900   | 400   | 900

1 个答案:

答案 0 :(得分:0)

您可以定义一个新的UDF函数以捕获两列之间的最大值,例如:

def maxDef(p1: Int, p2: Int): Int = if(p1>p2) p1 else p2
val max = udf[Int, Int, Int](maxDef)

然后在withColumn()中应用UDF来定义一个新列,例如:

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