使用spark scala在满足条件后标记记录

r3i60tvu  于 2021-05-22  发布在  Spark
关注(0)|答案(0)|浏览(258)

我需要一些Maven对以下情况的意见:
我有以下Dataframe df1 :

+------------+------------+-------+-------+
|   Date1    | OrderDate  | Value | group |
+------------+------------+-------+-------+
| 10/10/2020 | 10/01/2020 | hostA | grp1  |
| 10/01/2020 | 09/30/2020 | hostB | grp1  |
| Null       | 09/15/2020 | hostC | grp1  |
| 08/01/2020 | 08/30/2020 | hostD | grp1  |
| Null       | 10/01/2020 | hostP | grp2  |
| Null       | 09/28/2020 | hostQ | grp2  |
| 07/11/2020 | 08/08/2020 | hostR | grp2  |
| 07/01/2020 | 08/01/2020 | hostS | grp2  |
| NULL       | 07/01/2020 | hostL | grp2  |
| NULL       | 08/08/2020 | hostM | grp3  |
| NULL       | 08/01/2020 | hostN | grp3  |
| NULL       | 07/01/2020 | hostO | grp3  |
+------------+------------+-------+-------+

每个 group 订购人 OrderDatedescending 命令。订购后,每个 valueCurrent_date < (Date1 + 31Days) or Date1 as NULL 需要标记为 valid 直到 Current_date > (Date1 + 31Days) . 贴上,每 Value 应标记为 Invalid 不管 Date1 价值观。
如果是一个 group ,所有记录都是 NULL ,所有 Value 应标记为 Valid 我的输出df应该如下所示:

+------------+------------+-------+-------+---------+
|   Date1    | OrderDate  | Value | group |  Flag   |
+------------+------------+-------+-------+---------+
| 10/10/2020 | 10/01/2020 | hostA | grp1  | Valid   |
| 10/01/2020 | 09/30/2020 | hostB | grp1  | Valid   |
| Null       | 09/15/2020 | hostC | grp1  | Valid   |
| 08/01/2020 | 08/30/2020 | hostD | grp1  | Invalid |
| Null       | 10/01/2020 | hostP | grp2  | Valid   |
| Null       | 09/28/2020 | hostQ | grp2  | Valid   |
| 07/11/2020 | 08/08/2020 | hostR | grp2  | Invalid |
| 07/01/2020 | 08/01/2020 | hostS | grp2  | Invalid |
| NULL       | 07/01/2020 | hostL | grp2  | Invalid |
| NULL       | 08/08/2020 | hostM | grp3  | Valid   |
| NULL       | 08/01/2020 | hostN | grp3  | Valid   |
| NULL       | 07/01/2020 | hostO | grp3  | Valid   |
+------------+------------+-------+-------+---------+

我的方法:
我创造了 row_number 对于每个 group 订购后 OrderDate . 我得到的职位 min(row_number)Current_date > (Date1 + 31Days) 对于每个 group 并将其另存为新Dataframe dfMin .
然后我加入了 df1 以及 dfMingroup 并基于 row_number(row_number < min(row_number)) 这种方法适用于大多数情况。但是什么时候 group 的所有值 Date1NULL ,此方法失败。
有没有其他更好的方法也包括上述场景?
注意:我使用的是非常旧的spark版本- Spark 1.5 . 也 windows 函数在我的环境中不起作用(它是一个自定义框架,有很多限制)。为了 row_number ,我曾经 zipWithIndex 方法。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题