Scala Dataframe-groupby访问groupedDataSet中以前的记录
我有一个场景,需要根据Scala Dataframe-groupby访问groupedDataSet中以前的记录,scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我有一个场景,需要根据PolicyNo计算PreviousPolicyNo。首先需要根据TransactionDate对数据进行排序。然后,我们必须检查此类保单期限是否在之前可用,如果是,则从该记录中获取最新可用的PolicyNo(在TransactionDate之前可用),并记入PreviousPolicyNo。如果此类PolicyTerm在过去不可用,则选择最新的PolicyNo可用(到目前为止),或者如果之前不存在任何期限(第一行),则将条目标记为null 比如说, 为了计算最后一个条目
PolicyNo
计算PreviousPolicyNo
。首先需要根据TransactionDate
对数据进行排序。然后,我们必须检查此类保单期限是否在之前可用,如果是,则从该记录中获取最新可用的PolicyNo
(在TransactionDate
之前可用),并记入PreviousPolicyNo
。如果此类PolicyTerm
在过去不可用,则选择最新的PolicyNo
可用(到目前为止),或者如果之前不存在任何期限(第一行),则将条目标记为null
比如说,
为了计算最后一个条目,我必须查找到目前为止可用的PolicyTerm
-2的最后一个值(2014年12月12日之前),同样,对于最后一个条目,我必须查找可用的PolicyTerm
3的最后一个记录(2014年12月12日之前)
我需要Scala实现方面的帮助,我实现了一个UDF
(我在列表[Struct]
中收集了这些列),但它在处理大型数据集时效果不佳。可以使用窗口函数,因为它们同时允许分区和排序。但是,这两种情况需要单独的窗口功能。下面的w1
对应于相同的PolicyTerm
以前出现过的情况(因此被PolicyTerm
分割),w2
另一方面选择最新的PolicyNo
,而不考虑PolicyTerm
val w1 = Window.partitionBy("PolicyTerm").orderBy("TransactionDate")
val w2 = Window.orderBy("TransactionDate")
val df2 = df.withColumn("LagGroupPolicyNo", lag($"PolicyNo", 1).over(w1))
.withColumn("LagPolicyNo", lag($"PolicyNo", 1).over(w2))
.withColumn("PreviousPolicyNo", coalesce($"LagGroupPolicyNo", $"LagPolicyNo"))
.drop("LagGroupPolicyNo", "LagPolicyNo")
如果我必须在这里处理多个PolicyID,您能建议我需要做哪些更改吗。@Sandeep:这应该很简单,只需在两个窗口中按PolicyID
分区即可。更改为:val w1=Window.partitionBy(“PolicyID”、“PolicyTerm”).orderBy(“TransactionDate”)
和val w2=Window.partitionBy(“PolicyID”).orderBy(“TransactionDate”)
。