def first作为org.apache.spark.sql函数的一部分存在。 我看到它在很多地方都在使用。示例代码:
override def extractPersonDataset: DataFrame = {
super.extractPersonDataset
.withColumn("marketplace_id", lit(marketplaceId))
.groupBy(joinColumns.head, joinColumns.tail: _*)
.agg(
collect_list("college_id") as "college_ids",
collect_list("nickname") as "nickname",
collect_list("type") as "types",
first("warehouse_id") as "warehouse_id",
first("operating_model") as "operating_model",
first("type") as "type",
first("has_membership") as "has_membership"
)
}
我搜索了许多博客和文档,但没有一个能让我清楚地了解它是如何工作的。有人可以解释一下它的作用吗?
对我来说,它有这些用法:
在 groupBy 之后的 agg 子句中:
我使用first
作为在groupBy
子句中放置一列的替代方法。如果每个分组的值是恒定的,或者只是无关紧要,这是有道理的。由于 groupBy 之前的排序不能保证被groupBy
守恒(据我所知(,你不能用它来获取第一个值,它只是取任何值。
使用窗口函数:
在这里,您可以使用它来获取给定帧顺序的真实第一个值。 例如,如果您有属性时间,测量温度,则可以使用first($"temperature").over(Window.orderBy($"time"))
获得第一个测量温度。请注意,您可以将最小/最大值与结构体(min(struct($"time",$"temperature")).over(Window...)
(结合使用来实现相同的效果,然后在最小化time
后提取温度(,但这有点麻烦。这也比最小/最大更强大,因为您必须选择跳过空值。