Spark数据框1.6

时间:2018-11-13 18:13:51

标签: apache-spark apache-spark-sql

数据转储

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数据框中完成任何帮助,我们将不胜感激。

1 个答案:

答案 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