在Scala中获取两个相似列的最小值或最大值

时间:2017-03-30 20:05:02

标签: scala spark-dataframe min

我刚刚开始学习Scala,我正试图找到一种方法来获取min中同一类型的两个或多个Columns的{​​{1}}。我有以下代码,它分别为DataFrame min提供了maxColumn

inputDF.select(min($"dropoff_longitude")).show
inputDF.select(max($"pickup_longitude")).show

如何获得minColumnsdropoff_longitude的{​​{1}}。我这样做了

pickup_longitude

有更好的方法吗?

谢谢

3 个答案:

答案 0 :(得分:4)

在许多情况下,避免collect可能更有效,以便Spark查询计划实现一次(因此,更少的数据读取,并且可能更少的改组)。在这种情况下,您可以使用例如:

val minValDf = inputDf.agg(min(col(inputCol1)).as(inputCol1), min(col(inputCol2).as(inputCol2)))
val minDf = minValDf.withColumn("minCol",
    when(col(inputCol1).gt(col(inputCol2)), col(inputCol2))
    .otherwise(col(inputCol1)))

答案 1 :(得分:1)

认为你可以这样做:

// assume all columns are of type Int, it could be other numeric type as well
val df = Seq((1,2),(3,4)).toDF("A", "B")    

df.agg(min($"A"), min($"B")).first().toSeq.map{ case x: Int => x }.min
// res14: Int = 1

答案 2 :(得分:1)

为此,您可以在选择表达式中使用leastgreatest Spark SQL函数。在您的情况下,它将如下所示:

import org.apache.spark.sql.functions._

val minLongitude =
    df.select(least($"pickup_longitude", $"dropoff_longitude") as "least_longitude")
      .agg(min($"least_longitude"))
      .head.getFloat(0)