我刚开始学习Scala,我正在尝试找出一种方法来获得DataFrame
中两个或多个相同类型的Columns
的min
。我有以下代码,它分别为我提供了Column
的min
和max
。
inputDF.select(min($"dropoff_longitude")).show
inputDF.select(max($"pickup_longitude")).show
我如何获得Columns
、dropoff_longitude
和pickup_longitude
的min
。我是这样做的
scala.math.min(
inputDF.select(min($"pickup_longitude")).head.getFloat(0),
inputDF.select(min($"dropoff_longitude")).head.getFloat(0)
)
有没有更好的方法可以做到这一点?
谢谢
为此
,您可以在选择表达式中使用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)
在许多情况下,避免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