Sql 从分组的RDD中选择最早和最晚的日期
我有一个分组的RDD表格(patientID,[药物]),其中药物为以下病例类别: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”的最早和最晚服用日期(注意,药物是一种病例类药物的
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)
返回内容的示例。