假设我们有一个凌乱的df
val df = Seq(
("id1", "2020-08-02 16:42:00", "2020-08-02 16:45:00", "item1", 1),
("id1", "2020-08-02 16:43:00", "2020-08-02 16:44:00", "item2", 0),
("id1", "2020-08-02 16:44:00", "2020-08-02 16:45:00", "item1", 0),
("id1", "2020-08-02 16:45:00", "2020-08-02 16:47:00", "item3", 0),
("id1", "2020-08-02 16:47:00", "2020-08-02 16:51:00", "item4", 0),
("id1", "2020-08-02 16:51:00", "2020-08-02 16:52:00", "item3", 0))
.toDF("id", "start_time", "end_time", "item_id", "flag")
df.show()
+---+-------------------+-------------------+-------+----+
| id| start_time| end_time|item_id|flag|
+---+-------------------+-------------------+-------+----+
|id1|2020-08-02 16:42:00|2020-08-02 16:45:00| item1| 1|
|id1|2020-08-02 16:43:00|2020-08-02 16:44:00| item2| 0|
|id1|2020-08-02 16:44:00|2020-08-02 16:45:00| item1| 0|
|id1|2020-08-02 16:45:00|2020-08-02 16:47:00| item3| 0|
|id1|2020-08-02 16:47:00|2020-08-02 16:51:00| item4| 0|
|id1|2020-08-02 16:51:00|2020-08-02 16:52:00| item3| 0|
+---+-------------------+-------------------+-------+----+
请注意,第一行 start_time = 16:42:00
以及 end_time = 16:45:00
,接下来的两行有一个 start_time
它们在 start_time
以及 end_time
第一排的。我已经有专栏了 flag
检测何时观察到这种情况的仪器。在本例中,我希望保留第一行并删除下两行。我只是用一个样本,但这样的情况可以看到多次。
所以我想要的结果是
+---+-------------------+-------------------+-------+
| id| start_time| end_time|item_id|
+---+-------------------+-------------------+-------+
|id1|2020-08-02 16:42:00|2020-08-02 16:45:00| item1|
|id1|2020-08-02 16:45:00|2020-08-02 16:47:00| item3|
|id1|2020-08-02 16:47:00|2020-08-02 16:51:00| item4|
|id1|2020-08-02 16:51:00|2020-08-02 16:52:00| item3|
+---+-------------------+-------------------+-------+
我试着创建一个不同的df,只过滤其中的行 flag = 1
进行条件连接
spark.conf.set("spark.sql.crossJoin.enabled", "true")
val dfFiltered = df.filter("flag == 1")
df.join(dfFiltered,
(df("id") == dfFiltered("id")) &&
(df("start_time") > dfFiltered("start_time")) &&
(df("start_time") < dfFiltered("end_time")))
.show()
但它返回错误的结果
2条答案
按热度按时间ergxz8rk1#
解决这个问题的另一种方法是不加入-您可以获得前几行的最大结束时间,并过滤掉start<max(结束时间)的行。
iaqfqrcu2#
你想用
left_anti
加入:或者在
WHERE
使用EXISTS
: