我有以下数据:
+-----------+-----------+-----------+-----+-----------+
| Env1_date | Env2_date | Env3_date | Pid | orderDate |
+-----------+-----------+-----------+-----+-----------+
| Null | Null | 1/9/2020 | abc | 10/6/2020 |
| Null | 1/9/2020 | 1/8/2020 | pqr | 10/4/2020 |
| 1/9/2020 | Null | Null | xyz | 10/2/2020 |
| 1/8/2020 | 1/7/2020 | Null | uvw | 10/1/2020 |
+-----------+-----------+-----------+-----+-----------+
我试图创建3个新的列,基本上告诉如果 Pid
对env1、env2和env3有效。为此,我首先在 orderDate
按降序排列的列(已在上表中排序)。
如果为 Env1_date
, Env2_date
, Env3_date
,最高纪录是 Null
,它们被认为是有效的。之后 Null
记录,如果日期小于特定日期(在本例中 1/9/2020
),它被认为是有效的。任何其他记录都被标记为无效。
如果顶级记录不是 NULL
,需要检查日期是否等于 1/9/2020
. 如果是,它们也被标记为有效
我的输出应该如下所示:
+-----------+-----------+-----------+-----+-----------+-----------+-----------+-----------+
| Env1_date | Env2_date | Env3_date | Pid | orderDate | Env1_Flag | Env2_Flag | Env3_Flag |
+-----------+-----------+-----------+-----+-----------+-----------+-----------+-----------+
| Null | Null | 1/9/2020 | abc | 10/6/2020 | Valid | Valid | Valid |
| Null | 1/9/2020 | 1/8/2020 | pqr | 10/4/2020 | Valid | Valid | Invalid |
| 1/9/2020 | Null | Null | xyz | 10/2/2020 | Valid | Invalid | Invalid |
| 1/8/2020 | 1/7/2020 | Null | uvw | 10/1/2020 | Invalid | Invalid | Invalid |
+-----------+-----------+-----------+-----+-----------+-----------+-----------+-----------+
我正试图通过使用 Spark 1.5
以及 scala
.
我试过用 lag
功能。但不能包含所有的场景。不知道如何解决这个问题。
有人能帮帮我吗。
注意:windows函数、todf()、createdataframe()函数在 spark
我正在使用。这是一个定制的spark环境,几乎没有限制
2条答案
按热度按时间nwsw7zdq1#
mxg2im7a2#
一种方法是将所有数据收集到驱动程序中,并将其作为常规数组进行处理,然后再次将其转换为df。不过要小心,数据应该适合驱动程序。
我写的代码可以处理你提供的数据。如果您稍微调整一下(尤其是数据比较部分),您应该会得到您所期望的结果。
这是上面打印行的输出