Как найти разницу между 1-й строкой и n-й строкой кадра данных на основе условия с помощью Spark Windowing - PullRequest
0 голосов
/ 21 мая 2019

Вот мое точное требование. Я должен добавить новый столбец с именем ("DAYS_TO_NEXT_PD_ENCOUNTER"). Как видно из названия, значения в новом столбце должны иметь разность RANK, в которой для request_typ указано «PD» и текущая строка. Для одного ID это может произойти между любыми RV и RJ. Для строк, которые присутствуют после первого вхождения Claim_typ как «PD», разница должна быть нулевой, как показано ниже:

API 'last' работает, если clm_typ 'PD' встречается как последний элемент. Так будет не всегда. Для одного идентификатора это может произойти между любыми 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 голосов
/ 21 мая 2019

Здесь показано решение 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...