首页 > 解决方案 > Spark Scala,获取1列的最大值,但保留所有列

问题描述

我有一个包含 3 列(客户、关联、时间戳)的数据框。

我想customer通过查看时间戳来获取最新信息。

试图

val rdd = readRdd.select(col("value"))
val val_columns = Seq("value.timestamp").map(x => last(col(x)).alias(x))
rdd.orderBy("value.timestamp")
   .groupBy("value.customer")
   .agg(val_columns.head, val_columns.tail: _*)
   .show()

我相信上面的代码是有效的,但试图弄清楚如何包含所有列(即关联)。如果我理解正确,将其添加到 groupby 将意味着我正在获取客户和关联的最新组合,但我只想从customer列中获取最新的而不是一起查看多个列。

编辑:

我可能会通过添加:

val val_columns = Seq("value.lastRefresh", "value.associations")
    .map(x => last(col(x)).alias(x))

对想法感到好奇。

标签: scalaapache-spark

解决方案


如果您想通过时间戳列返回最新的客户数据,您只需订购您的数据框value.timestamp并应用limit(1)

import org.apache.spark.sql.functions._
df.orderBy(desc("value.timestamp")).limit(1).show()

推荐阅读