与时间戳一起在Pyspark DataFrame中加入



我有一个火花数据帧如下

+--+--------+-----------+
|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.idid s成对,其中CC_11发生在r.id之前。

最新更新