我有一个火花数据框如下
+--+--------+-----------+
|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很新,我认为自我加入可能是一个好的开始
有人可以帮我吗?
答案 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)
。