数据转储
Work_Id,Assigned_to,Date,Status
R1,John,3/4/15,Not Started
R1,John,3/5/15,In Progress
R1,John,3/6/15,Finished
R3,Alaxender,3/7/15,In Progress
R3,Alaxender,3/8/15,In Progress
R4,Patrick,3/9/15,Finished
R5,Peter,3/11/15,Finished
R7,George,3/13/15,Not Started
R7,George,3/14/15,In Progress
R8,John,3/15/15,In Progress
R8,John,3/16/15,In Progress
R9,Alaxender,3/17/15,Not Started
最终输出
Work_Id,Assigned_to,Date,Status
R1,John,3/6/15,Finished
R7,George,3/14/15,In Progress
R9,Alaxender,3/17/15,Not Started
R3,Alaxender,3/7/15,In Progress
R3,Alaxender,3/8/15,In Progress
R4,Patrick,3/9/15,Finished
R5,Peter,3/11/15,Finished
R8,John,3/15/15,In Progress
R8,John,3/16/15,In Progress
有一个与上述相同的数据转储,由工作单组成。如果随后有同一个人的请求,并且状态为“未开始”,则最后一条记录(按日期排序)将被限定。如果只有一条状态为“未开始”的记录,则该记录将是合格的。
例如:
R1,John,3/4/15,Not Started
R1,John,3/5/15,In Progress
R1,John,3/6/15,Finished
此记录将是合格的
R1,John,3/6/15,Finished
在状态输出中,除状态之外的所有其他记录均属于“未开始”。
只要使用scala在Spark 1.6数据框中完成任何帮助,我们将不胜感激。
答案 0 :(得分:0)
我有一个答案,但这当前使工作性能下降。有什么更好的方法吗?
val df = myFile.toDF()
val dfFilter = df.filter($"status" === "Not Started")
val dfSelect = dfFilter.select(($"Assigned_to").alias("person"))
val dfInner = dfSelect.join(df, $"person" === $"Assigned_to")
val windowSpec = Window.partitionBy($"Assigned_to").orderBy(col("Date").desc)
val dfRank = dfInner.withColumn("rank", rank().over(windowSpec)).filter($"rank" === "1")
val dfDrop = dfRank.drop($"rank").drop($"person")
val dfLeftOuter = df.join(dfSelect, $"Assigned_to" === $"person", "leftouter")
val nullDf = dfLeftOuter.filter($"person".isNull).drop($"person")
nullDf.unionAll(dfDrop).show