Как присоединиться к последнему времени до текущего времени строки (Pyspark 2.4.4 Dataframes) - PullRequest
1 голос
/ 27 мая 2020

Мне сложно понять, как сделать следующее:

У меня есть 2 фрейма данных в Pyspark «df1» выглядит так:

+----+-------------+-------+
| id | SMS Created |Content|
+----+-------------+-------+
| 1  | 12:00:00    | a     |
+----+-------------+-------+
| 2  | 13:00:00    | b     |
+----+-------------+-------+
| 3  | 11:00:00    | c     |
+----+-------------+-------+

df2 выглядит так :

+---------+----------+----+---------+
| Event   | Time     | id | Members |
+---------+----------+----+---------+
| Created | 11:30:00 | 1  | [1,2]   |
+---------+----------+----+---------+
| Updated | 11:42:00 | 1  | [1,2,3] |
+---------+----------+----+---------+
| Updated | 11:50:00 | 1  | [1,2,4] |
+---------+----------+----+---------+
| Updated | 12:50:00 | 1  | [1,2]   |
+---------+----------+----+---------+
| Created | 12:30:00 | 2  | [1,2]   |
+---------+----------+----+---------+
| Updated | 12:42:00 | 2  | [1,2,3] |
+---------+----------+----+---------+
| Updated | 12:50:00 | 2  | [1,2,4] |
+---------+----------+----+---------+
| Updated | 13:10:00 | 2  | [1,2]   |
+---------+----------+----+---------+
| Created | 10:30:00 | 3  | [1,2]   |
+---------+----------+----+---------+
| Updated | 10:42:00 | 3  | [1,2,3] |
+---------+----------+----+---------+
| Updated | 10:50:00 | 3  | [1,2,4] |
+---------+----------+----+---------+
| Updated | 12:10:00 | 2  | [1,2]   |
+---------+----------+----+---------+

df2 обновляется каждый раз, когда члены меняются, но сообщения отправляются только тому, кто является «Участником» до времени «SMS Created».

Обратите внимание, что есть Обновлено время ПОСЛЕ времени «Создано SMS», поэтому использование любой функции MAX () без условий здесь не работает. Я просто не могу понять, как это сделать.

Как бы вы присоединились к самому последнему «Событию» ДО «Создано SMS», чтобы таблица выглядела так:

+----+-------------+---------+---------+----------+---------+
| id | SMS Created | Content | Event   | Time     | Members |
+----+-------------+---------+---------+----------+---------+
| 1  | 12:00:00    | a       | Updated | 11:50:00 | [1,2.4] |
+----+-------------+---------+---------+----------+---------+
| 2  | 13:00:00    | b       | Updated | 12:50:00 | [1,2,4] |
+----+-------------+---------+---------+----------+---------+
| 3  | 11:00:00    | c       | Updated | 10:50:00 | [1,2,4] |
+----+-------------+---------+---------+----------+---------+

Я использую Pyspark 2.4.4 с Dataframe API. Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 28 мая 2020

welcome to SO

Попробуйте это:

from pyspark.sql import functions as F
from pyspark.sql.window import Window

w=Window().partitionBy("id")
df1.join(df2.withColumnRenamed("id","id2"), (F.col("id")==F.col("id2"))&(F.col("SMS Created")>F.col("Time"))).drop("id2")\
   .withColumn("max", F.max("Time").over(w))\
   .filter('max=Time').drop("max").orderBy("id").show()

#+---+-----------+-------+-------+--------+---------+
#| id|SMS Created|Content|  Event|    Time|  Members|
#+---+-----------+-------+-------+--------+---------+
#|  1|   12:00:00|      a|Updated|11:50:00|[1, 2, 4]|
#|  2|   13:00:00|      b|Updated|12:50:00|[1, 2, 4]|
#|  3|   11:00:00|      c|Updated|10:50:00|[1, 2, 4]|
#+---+-----------+-------+-------+--------+---------+
...