具有时间戳的pyspark数据帧中的自连接
我有一个spark数据框,如下所示具有时间戳的pyspark数据帧中的自连接,pyspark,Pyspark,我有一个spark数据框,如下所示 +--+--------+-----------+ |id| account| time| +--+--------+-----------+ | 4| aa| 01/01/2017| | 2| bb| 03/01/2017| | 6| cc| 04/01/2017| | 1| bb| 05/01/2017| | 5| bb| 09/01/2017|
+--+--------+-----------+
|id| account| time|
+--+--------+-----------+
| 4| aa| 01/01/2017|
| 2| bb| 03/01/2017|
| 6| cc| 04/01/2017|
| 1| bb| 05/01/2017|
| 5| bb| 09/01/2017|
| 3| aa| 02/01/2017|
+--+--------+-----------+
+---+---+-------+
|id1|id2|account|
+---+---+-------+
| 4| 3| aa|
| 2| 5| bb|
| 1| 5| bb|
| 2| 1| bb|
+---+---+-------+
我想得到如下数据
+--+--------+-----------+
|id| account| time|
+--+--------+-----------+
| 4| aa| 01/01/2017|
| 2| bb| 03/01/2017|
| 6| cc| 04/01/2017|
| 1| bb| 05/01/2017|
| 5| bb| 09/01/2017|
| 3| aa| 02/01/2017|
+--+--------+-----------+
+---+---+-------+
|id1|id2|account|
+---+---+-------+
| 4| 3| aa|
| 2| 5| bb|
| 1| 5| bb|
| 2| 1| bb|
+---+---+-------+
因此,我需要在帐户中找到任何可能的对,id1
将是较早时间的id,id2
将是较晚时间的id。
我是pyspark的新手,我认为自助加入可能是一个好的开始。有人可以帮我吗?IIUC,您可以使用自连接来实现这一点:
导入pyspark.sql.f函数
df.alias('l').join(df.alias('r'),on='account')\
.其中('r.time>l.time')\
.选择(f.col('l.id')。别名('id1'),f.col('r.id')。别名('id2'),'l.account'))\
.show()
#+---+---+-------+
#|id1 | id2 |账户|
#+---+---+-------+
#|1 | 5 | bb|
#|2 | 1 | bb|
#|2 | 5 | bb|
#|4 | 3 | aa|
#+---+---+-------+
- 将数据帧(
)加入到df
帐户的自身中。(我们将左数据帧和右数据帧分别命名为
和'l'
)'r'
- 下一个过滤器使用
仅保留where
中的行r.time>l.time
- 对于相同的
,剩下的都是成对的账户
s,其中id
出现在l.id
之前李>r.id