Sql 从分组的RDD中选择最早和最晚的日期

Sql 从分组的RDD中选择最早和最晚的日期,sql,scala,apache-spark,Sql,Scala,Apache Spark,我有一个分组的RDD表格(patientID,[药物]),其中药物为以下病例类别: case class Medication(patientID: String, date: Date, medicine: String) RDD由以下行组成: val grpMeds = medication.groupBy(_.patientID) 其中,药物是RDD[药物]形式的RDD 对于每一位患者,我都在努力寻找一种特殊药物“medicine_a”的最早和最晚服用日期(注意,药物是一种病例类药物的

我有一个分组的RDD表格(patientID,[药物]),其中药物为以下病例类别:

case class Medication(patientID: String, date: Date, medicine: String)
RDD由以下行组成:

val grpMeds = medication.groupBy(_.patientID)
其中,药物是RDD[药物]形式的RDD

对于每一位患者,我都在努力寻找一种特殊药物“medicine_a”的最早和最晚服用日期(注意,药物是一种
病例类药物的方法。我希望得到的是RDD格式的RDD[patientID,earliestDate,latestDate],但不知道如何获得它

任何帮助都将不胜感激。下面显示了数据的示例(从
grpMeds.take(0).foreach(println)
)获取)

Medication(000961291-01,Tue Jun 21 19:45:00 UTC 2005,Isotonic Saline (0.9%))
Medication(000096430-01,Mon Nov 15 20:45:00 UTC 2010,insulin aspart)

使用
groupBy
是一种非常低效的方法。作为替代,我建议使用Spark SQL或
reduceByKey

对于Spark SQL,您应该将
药物
转换为
数据帧

import spark.implicits._  // import sqlContext.implicits._

val medicationDF = medication.toDF
并使用
groupBy
,后跟
agg

medicationDF.groupBy($"patientID", $"medicine").agg(min($"date"), max($"date"))
对于这个解决方案,
date
应该是
java.sql.date
java.sql.Timestamp

对于
reduceByKey
而言,首先您应该重塑
medicing
,以获得由
patientId
medicine
组成的密钥以及重复的
日期
值:

val medicationPairs = medication.map(m => 
  ((m.patientID, m.medicine), (m.date, m.date))
)
下一步
reduceByKey

medicationPairs.reduceByKey { 
  case ((xMin, xMax), (yMin, yMax)) => (
    if(xMin.before(yMin)) xMin else yMin,
    if(xMax.after(yMax))  xMax else yMax
  )
}

那么使用
min
max
有什么不对呢?示例数据和预期结果将非常有用…Date是java.utils.Date函数。我不相信它有一个min/max方法,但我可以使用date1.before(date2)。添加了
grpMeds.take(0).foreach(println)
返回内容的示例。