假设我有一个像这样的数据结构,其中 ts 是一些时间戳
case class Record(ts: Long, id: Int, value: Int)
给定大量这些记录,我希望得到每个 id 时间戳最高的记录。使用 RDD api,我认为以下代码可以完成工作:
def findLatest(records: RDD[Record])(implicit spark: SparkSession) = {
records.keyBy(_.id).reduceByKey{
(x, y) => if(x.ts > y.ts) x else y
}.values
}
同样,这是我对数据集的尝试:
def findLatest(records: Dataset[Record])(implicit spark: SparkSession) = {
records.groupByKey(_.id).mapGroups{
case(id, records) => {
records.reduceLeft((x,y) => if (x.ts > y.ts) x else y)
}
}
}
我一直在尝试解决如何使用数据框实现类似的功能,但无济于事-我意识到我可以使用以下方法进行分组:
records.groupBy($"id")
但这给了我一个 RelationGroupedDataSet 并且我不清楚我需要编写什么聚合函数来实现我想要的 - 我见过的所有示例聚合似乎都专注于只返回一个被聚合的列而不是整行。
是否可以使用数据框来实现这一点?