Scala RDD按组获取最早日期

Posted

技术标签:

【中文标题】Scala RDD按组获取最早日期【英文标题】:Scala RDD get earliest date by group 【发布时间】:2021-11-14 15:36:59 【问题描述】:

我在 Scala 中有一个案例类 RDD,需要按每个组(患者 ID)查找最早的日期。

这是输入:

patientID       date
000000047-01    2008-03-21T21:00:00Z
000000047-01    2007-10-24T19:45:00Z
000000485-01    2011-06-17T21:00:00Z
000000485-01    2006-02-22T18:45:00Z

预期应该是:

patientID       date
000000047-01    2007-10-24T19:45:00Z
000000485-01    2006-02-22T18:45:00Z

我尝试了类似以下的方法,但没有成功

val out = medication.groupBy(x => x.patientID).sortBy(x => x.date).take(1)

【问题讨论】:

定义“不起作用”:您遇到什么错误?你有什么不明白的? 提示:groupBy 的返回类型是什么? 【参考方案1】:

好的! 所以我正确理解了你的问题,你希望每条记录都排在首位,如果是这种情况,那么我在这里创建了解决方案。

 val dataDF = Seq(
            ("000000047-01",    "2008-03-21T21:00:00Z"),
            ("000000047-01" ,   "2007-10-24T19:45:00Z"),
            ("000000485-01",    "2011-06-17T21:00:00Z"),
            ("000000485-01",    "2006-02-22T18:45:00Z"))

  import spark.implicits._
  val dfWithSchema = dataDF.toDF("patientId", "date")
  val winSpec = Window.partitionBy("patientId").orderBy("date")

  val rank_df = dfWithSchema.withColumn("rank", rank().over(winSpec)).orderBy(col("patientId"))
   val result = rank_df.select(col("patientId"),col("date")).where(col("rank") === 1)
  result.show()

如果您已经使用数据定义了架构,请忽略使用架构创建 DF 的步骤。

【讨论】:

谢谢!但我不想转换为数据框,我只想使用 RDD 转换。 好的,那么我们可以在所有这些操作之后不将DF转换为RDD吗?也许是result.rdd,因为如果我们倾向于过滤需求,DF 是更合适的选择,也可能是数据集。

以上是关于Scala RDD按组获取最早日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的输入的每一行中获取最早日期和最早日期之间的天数

获取不同年份中按日/月的最早日期

sql查询获取最早日期

按组将数据框日期拆分为单个最小最大日期范围

如何获取每组最早日期的记录

如何在scala中获取周开始日期