我有一个火花数据帧如下
+--+--------+-----------+
|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,您可以使用自我加入:
import pyspark.sql.functions as f
df.alias('l').join(df.alias('r'), on='account')
.where('r.time > l.time')
.select(f.col('l.id').alias('id1'), f.col('r.id').alias('id2'), 'l.account')
.show()
#+---+---+-------+
#|id1|id2|account|
#+---+---+-------+
#| 1| 5| bb|
#| 2| 1| bb|
#| 2| 5| bb|
#| 4| 3| aa|
#+---+---+-------+
- 在
account
上将数据框架(df
(加入自身。(我们分别以'l'
和'r'
的形式将左和右数据框架别名。( - 使用
where
的下一个过滤器仅保留r.time > l.time
的行。 - 剩下的所有内容将是
l.id
的id
s成对,其中CC_11发生在r.id
之前。