Spark 'limit' 不运行 并行吗?

Spark 'limit' does not run in parallel?

我有一个简单的连接,我在其中限制了边。在解释计划中我看到在执行限制之前有一个 ExchangeSingle 操作,实际上我看到在这个阶段集群中只有一个任务 运行。

这当然会显着影响性能(取消限制会消除单个任务瓶颈,但会延长连接时间,因为它适用于更大的数据集)。

limit真的不可并行吗?如果是,是否有解决方法?

我在 Databricks 集群上使用 spark。

编辑:关于可能的重复。答案并没有解释为什么所有东西都被洗牌到一个分区中。另外-我征求了解决这个问题的建议。

根据user8371915在评论中的建议,我使用了sample而不是limit。它打开了瓶颈。

一个小而重要的细节:我仍然必须在样本之后对结果集设置一个可预测的大小约束,但是样本输入了一个分数,所以结果集的大小可以非常依赖于输入的大小.

对我来说幸运的是,运行 使用 count() 进行相同的查询非常快。所以我首先统计了整个结果集的大小,并用它来计算我后来在样本中使用的分数。

限制后并行化的解决方法: .repartition(200)

这会再次重新分配数据,以便您可以并行工作。