具有时间戳的pyspark数据帧中的自连接

具有时间戳的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|

我有一个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|    
| 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
    中的行
  • 对于相同的
    账户
    ,剩下的都是成对的
    id
    s,其中
    l.id
    出现在
    r.id
    之前