我刚刚开始学习Scala,我正试图找到一种方法来获取min
中同一类型的两个或多个Columns
的{{1}}。我有以下代码,它分别为DataFrame
min
提供了max
和Column
。
inputDF.select(min($"dropoff_longitude")).show
inputDF.select(max($"pickup_longitude")).show
如何获得min
,Columns
和dropoff_longitude
的{{1}}。我这样做了
pickup_longitude
有更好的方法吗?
谢谢
答案 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)
为此,您可以在选择表达式中使用least
和greatest
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)