数据框-grouped访问groupedDataSet中的上一个记录的上一个

我有一个场景,我需要基于PreviousPolicyNo计算PolicyNo。首先需要根据TransactionDate对数据进行排序。然后,我们将必须检查是否有这样一个PolicyTerm之前是否可用,如果有,请从该记录中获取最新的可用PolicyNo(在TransactionDate之前可用)并输入PreviousPolicyNo。如果过去没有这样的PolicyTerm,请选择最新的PolicyNo(到目前为止),或者如果以前没有较早的术语(第一行),则将该条目标记为null。

例如,

数据框-grouped访问groupedDataSet中的上一个记录的上一个

要计算倒数第二个条目,我必须寻找PolicyTerm-2到目前为止(2014年12月12日之前)可用的最后一个值,同样,对于最后一个条目,我必须寻找最后一个记录可用(2014年12月12日之前)和PolicyTerm 3。

我需要有关Scala实施的帮助,我实现了UDF(在List[Struct]中收集了这些列),但是对于庞大的数据集来说效果不佳。

yj9981n 回答:数据框-grouped访问groupedDataSet中的上一个记录的上一个

由于可以同时进行分区和排序,因此可以使用窗口函数。但是,这两个条件将需要单独的窗口函数。 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",1).over(w2))
  .withColumn("PreviousPolicyNo",coalesce($"LagGroupPolicyNo",$"LagPolicyNo"))
  .drop("LagGroupPolicyNo","LagPolicyNo")
本文链接:https://www.f2er.com/3119841.html

大家都在问