使用Spark Scala在满足条件后标记记录
我需要一些专家对以下情况的意见: 我有以下数据帧使用Spark Scala在满足条件后标记记录,scala,apache-spark,apache-spark-sql,apache-spark-1.5,Scala,Apache Spark,Apache Spark Sql,Apache Spark 1.5,我需要一些专家对以下情况的意见: 我有以下数据帧df1: +------------+------------+-------+-------+ | Date1 | OrderDate | Value | group | +------------+------------+-------+-------+ | 10/10/2020 | 10/01/2020 | hostA | grp1 | | 10/01/2020 | 09/30/2020 | hostB | grp1 | |
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 |
+------------+------------+-------+-------+
每个组
按OrderDate
的降序排列。订购后,每个值
的当前日期<(Date1+31天)或Date1为空
需要标记为有效
,直到当前日期>(Date1+31天)
。
在此之后,无论Date1
值如何,每个值都应标记为无效
如果对于组
,所有记录均为空
,则所有值
应标记为有效
我的输出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 |
+------------+------------+-------+-------+---------+
我的方法:
在通过OrderDate
订购后,我为每个组创建了行编号
。
张贴我正在获得每个组的min(行编号)
具有当前日期>(日期1+31天)
,并将其保存为新数据框dfMin
然后,我在group
上加入df1
和dfMin
,并根据行数(行数
这种方法适用于大多数情况。但对于组
而言,当Date1
的所有值均为NULL
时,此方法失败
是否有其他更好的方法也包括上述场景
注意:我使用的是相当旧的Spark版本-Spark 1.5
。另外,windows
function在我的环境中也不起作用(这是一个自定义框架,有很多限制)。对于row\u number
,我使用了zipWithIndex
方法。这几天谁让我们参加了1.5的考试?我会升级。我完全同意@thebluephantom。但我的组织不是。