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



我刚开始学习Scala,我正在尝试找出一种方法来获得DataFrame中两个或多个相同类型的Columnsmin。我有以下代码,它分别为我提供了Columnminmax

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

我如何获得Columnsdropoff_longitudepickup_longitudemin。我是这样做的

scala.math.min(
   inputDF.select(min($"pickup_longitude")).head.getFloat(0),
   inputDF.select(min($"dropoff_longitude")).head.getFloat(0)
)

有没有更好的方法可以做到这一点?

谢谢

为此

,您可以在选择表达式中使用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)

在许多情况下,避免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)))

认为你可以做这样的事情:

// 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

相关内容

  • 没有找到相关文章

最新更新