pyspark 乘坐多个航班的客户的出发地和最后目的地

yebdmbv4  于 2023-02-15  发布在  Spark
关注(0)|答案(2)|浏览(119)

对于每个客户ID,我需要使用spark / pyspark找出首个航班来源和最后一个航班目的地
cid --〉客户ID
fid --〉航班ID --它是随机的
输入数据框:
| 苹果汁|叉|原点|目的地|
| - ------|- ------|- ------|- ------|
| 1个|十二层|得克萨斯|纽约|
| 1个|f21|纽约|德里|
| 1个|第八代|德里|日本|
德克萨斯州-〉纽约-〉日本
输出 Dataframe :
| 苹果汁|原点|目的地|
| - ------|- ------|- ------|
| 1个|得克萨斯|日本|
我试着用连接来做,但是不知道如何合并连接后的结果集,以便只过滤起始航班源和最后航班目的地

hgqdbh6s

hgqdbh6s1#

    • 更新:**如果订单不确定:
df.groupBy("cid").agg(F.collect_list("origin").alias("origin"), F.collect_list("destination").alias("destination")).select(col("cid"), F.array_except(col("origin"), col("destination")).alias("origin"), F.array_except(col("destination"), col("origin")).alias("destination")).show(truncate=False)

输出:

本质上,首先,将所有起点和终点收集为数组。

如您所见,停靠点(即除起点和最后目的地之外的点)将在两个数组中共用。
如果秩序是确定的,那么这也是可行的:

df.groupBy("cid").agg(F.first("origin").alias("origin"), F.last("destination").alias("destination")).show()

输出:

尽管如果行的顺序被打乱了,这就不起作用了。

kyks70gy

kyks70gy2#

假设乘客从来不乘坐一架以上的飞机,因此有一个唯一的路径为他们旅行
(假设起始位置start
1.运行查询SELECT * FROM df where origin = start,这样您就可以获得所有可到达的目的地
1.将目的地存储在列表中
1.在下一步中,使用start = destinations运行上述查询
这将发现上述路径。
如果没有给定start,你可以做一些更复杂的事情,比如选择一个随机记录,到达前面解释过的alo目的地,然后往回走,到达所有的源,然后加入这两条路径,你就成功地重建了遍历。

相关问题