自我加入带时间戳的pyspark数据帧

时间:2018-03-27 08:42:44

标签: pyspark

我有一个火花数据框如下

+--+--------+-----------+
|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很新,我认为自我加入可能是一个好的开始 有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

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|
#+---+---+-------+
  • df上加入DataFrame(account)给自己。 (我们将左右DataFrame分别称为'l''r'。)
  • 使用where进行下一次过滤,仅保留r.time > l.time
  • 所在的行
  • 剩下的所有内容都是成对的id成对account l.id r.id -- definition of a Turing machine data TuringMachine a = TuringMachine State -- q0 (Set State) -- F (Set State) -- Q (Set (Symbol a)) -- Gamma (Set (Symbol a)) -- Sigma (Map (State, Symbol a) (State, Symbol a, Instruction)) -- delta deriving (Show)