如何使用 Spark Windowing 根据条件查找数据帧的第一行和第 n 行之间的差异
How to find the difference between 1st row and nth row of a dataframe based on a condition using Spark Windowing
这是我的确切要求。我必须添加一个名为 ("DAYS_TO_NEXT_PD_ENCOUNTER") 的新列。顾名思义,新列中的值应具有 claim_typ 作为 'PD' 的 RANK 与当前行的差异。对于一个 ID,它可以出现在任何“RV”和“RJ”之间。对于 claim_typ 作为 'PD' 首次出现后出现的行,差异应为空,如下所示:
如果 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|
+----------+--------+---------+----+-------------------------+
此处显示的是 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()
这是我的确切要求。我必须添加一个名为 ("DAYS_TO_NEXT_PD_ENCOUNTER") 的新列。顾名思义,新列中的值应具有 claim_typ 作为 'PD' 的 RANK 与当前行的差异。对于一个 ID,它可以出现在任何“RV”和“RJ”之间。对于 claim_typ 作为 'PD' 首次出现后出现的行,差异应为空,如下所示:
如果 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|
+----------+--------+---------+----+-------------------------+
此处显示的是 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()