【问题标题】:Origin and last destination of a customer who has taken multiple flights乘坐过多次航班的客户的出发地和最后目的地
【发布时间】:2023-02-14 13:21:17
【问题描述】:

对于每个客户 ID,我需要使用 spark / pyspark 找出第一个航班来源和最后一个航班目的地

cid --> customerId

fid --> 航班 ID -- 它是随机的

输入数据帧:

cid fid origin destination
1 f12 texas newyork
1 f21 newyork delhi
1 f08 delhi japan

德州 -> 纽约 -> 日本

输出数据帧:

cid origin destination
1 texas japan

我尝试用连接来做,但不确定如何在连接后合并结果集以仅过滤起始航班源和最后航班目的地

【问题讨论】:

  • 谢谢@RonakJain。这很有帮助。我在考虑数据帧非常大的情况。不收集列表 (F.collect_list("origin") 会减慢查询速度。
  • collect_list 的性能影响与任何 groupBy 操作一样好,因为我们会将客户的所有航班带到一个地方。如果您的数据框已经以这种方式分区 - 就不会有问题。 collect_list 类似于字符串连接,而不是 collectAsList()
  • df.groupBy("cid") -- 任何聚合帖子都将具有类似的性能。

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

更新:如果顺序不确定:

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()

输出:

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

【讨论】:

  • 这是否仅因为正确的起点和终点在数据框中排序而起作用?如果顺序错误怎么办?
  • 如前所述,如果数据框本身没有顺序 - 我们需要一些列来确定正确的顺序,例如date - 在这种情况下我们只添加 orderBy(date)
  • 不一定,如果数据框包含没有循环的步行,则可以用简单的图论重建它。
  • @Neervana 哦对了,在那种情况下,我们可以利用超前/滞后。将更新我的答案
  • @Neervana 已更新以处理乱序情况
【解决方案2】:

假设乘客从不乘坐超过一架飞机,因此他们有一条独特的旅行路径

(假设开始位置start

  1. 运行查询SELECT * FROM df where origin = start,这样你就可以获得所有可达的目的地
  2. 将目的地存储在列表中
  3. 使用start = destinations运行上述查询以进行下一步

    这将发现上述路径。

    如果没有给出开始,你可以做一些更复杂的事情,比如选择一个随机记录,如上所述到达一个目的地,然后返回,到达所有源,然后你加入这两条路径,你就成功地重建了步行.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2019-06-13
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多