如何使用Spark Windowing根据条件查找数据帧的第一行和第n行之间的差异

时间:2019-05-21 15:16:53

标签: scala apache-spark windowing

这是我的确切要求。我必须添加一个名为(“ DAYS_TO_NEXT_PD_ENCOUNTER”)的新列。顾名思义,新列中的值应与RANK区别,该列具有Claim_typ为“ PD”和当前行。对于一个ID,它可以出现在“ RV”和“ RJ”之间。对于第一次出现Claim_typ之后显示为“ PD”的行,差异应为null,如下所示:

如果clm_typ'PD'作为最后一个元素出现,则API'last'将起作用。并非总是如此。对于一个ID,它可以出现在“ RV”和“ RJ”之间。

+----------+--------+---------+----+-------------------------+ | ID | WEEK_ID|CLAIM_TYP|RANK|DAYS_TO_NEXT_PD_ENCOUNTER| +----------+--------+---------+----+-------------------------+ | 30641314|20180209| RV| 1| 5| | 30641314|20180209| RJ| 2| 4| | 30641314|20180216| RJ| 3| 3| | 30641314|20180216| RJ| 4| 2| | 30641314|20180216| RJ| 5| 1| | 30641314|20180216| PD| 6| 0| | 48115882|20180209| RV| 1| 3| | 48115882|20180209| RV| 2| 2| | 48115882|20180209| RV| 3| 1| | 48115882|20180209| PD| 4| 0| | 48115882|20180216| RJ| 5| null| | 48115882|20180302| RJ| 6| null| +----------+--------+---------+----+-------------------------+

1 个答案:

答案 0 :(得分:0)

此处显示的是PySpark解决方案。

您可以将条件聚合与max(when...))一起使用,以获取与第一行“ PD”的必要等级差异。得到差异后,请使用when...null排负序的行,因为它们都出现在第一行“ PD”之后。

# necessary imports 
w1 = Window.partitionBy(df.id).orderBy(df.svc_dt)
df = df.withColumn('rnum',row_number().over(w1))
w2 = Window.partitionBy(df.id)
res = df.withColumn('diff_pd_rank',max(when(df.clm_typ == 'PD',df.rnum)).over(w2) - rnum)
res = res.withColumn('days_to_next_pd_encounter',when(res.diff_pd_rank >= 0,res.diff_pd_rank))
res.show()