Предполагая, что у вас есть DF как это:
+-------+----------+----------+
|User_id|product_id| action|
+-------+----------+----------+
| 1| apple| incart|
| 1| apple|purchased |
| 1| banana| incart|
| 2| banana| incart|
| 2| banana| purchased|
| 3| carrot| incart|
+-------+----------+----------+
подход может быть применен groupBy для создания нового поля, содержащего все действия, а затем отфильтровать по вашим желаемым условиям.
val output = df.groupBy("User_id","product_id").agg(collect_list("action").as("set"))
Затем выберите желаемое условие. В этом случае:
output.where(array_contains($"set", "incart").and(!array_contains($"set", "purchased"))).select("User_id","product_id").show()
даст ожидаемый результат:
+-------+----------+
|User_id|product_id|
+-------+----------+
| 3| carrot|
| 1| banana|
+-------+----------+