Apache spark 数据帧orderBy后跟Spark中的限制

Apache spark 数据帧orderBy后跟Spark中的限制,apache-spark,Apache Spark,我正在让一个程序生成一个数据帧,它将在该数据帧上运行 Select Col1, Col2... orderBy(ColX) limit(N) 然而,当我最终收集数据时,我发现如果我取一个足够大的top N,就会导致驱动程序OOM 另一个观察结果是,如果我只做sort和top,这个问题就不会发生。因此,只有同时存在sort和top时才会发生这种情况 我想知道为什么会这样?特别是,在这两种变换的组合下到底发生了什么?spark将如何使用排序和限制来评估查询,以及下面对应的执行计划是

我正在让一个程序生成一个数据帧,它将在该数据帧上运行

    Select Col1, Col2...
    orderBy(ColX) limit(N)
然而,当我最终收集数据时,我发现如果我取一个足够大的top N,就会导致驱动程序OOM

另一个观察结果是,如果我只做sort和top,这个问题就不会发生。因此,只有同时存在sort和top时才会发生这种情况

我想知道为什么会这样?特别是,在这两种变换的组合下到底发生了什么?spark将如何使用排序和限制来评估查询,以及下面对应的执行计划是什么

还有一点很奇怪,数据帧和RDD之间的spark句柄sort和top有什么不同吗

编辑, 对不起,我不是说收款,
我最初的意思是,当我调用任何操作来具体化数据时,无论是收集还是将数据发送回驱动程序的任何操作,因此问题肯定不在输出大小上

,但不清楚为什么在这种特定情况下失败,您可能会遇到多个问题:

当您使用limit时,它只是将所有数据放在一个分区上,而不管n有多大。因此,虽然它没有明确地收集到几乎同样糟糕的信息。 除此之外,orderBy还需要使用范围分区进行完全洗牌,当数据分布发生倾斜时,这可能会导致不同的问题。 最后,当您收集结果时,结果可能会大于驱动程序上可用的内存量。 如果你收集任何东西,这里没有什么可以改进的。最终,驾驶员记忆将成为一个限制因素,但仍有一些可能的改进:

首先,不要使用限制。 用Toloca读写器替换collect。 使用orderBy |>rdd |>zipWithIndex |>过滤器,或者如果精确的值数不是一个硬要求,则直接根据近似分布过滤数据,如Spark 2.0.0+中所示,有一种简便的近似分位数法。
我建议您在问题中添加代码。导致OOM错误的原因通常是驾驶员侧。但是没有真正的代码是很难说的。你能写一个如何使用ZipIndex的例子吗?