【问题标题】:Scala RDD get earliest date by groupScala RDD按组获取最早日期
【发布时间】: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 的返回类型是什么?

标签: scala rdd


【解决方案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 是更合适的选择,也可能是数据集。
猜你喜欢
  • 1970-01-01
  • 2021-06-29
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多