Apache SPARK:哪些SQL操作只能由SPARK通过将所有数据移动到一个分区来执行



我们知道Spark中的一些操作可以并行执行。例如,当spark加入或分组数据集时,它是在重新洗牌后并行进行的。

其他操作可能可以并行进行:例如,简单的排序。我猜spark通过排序键重新排列数据,从而生成一个排序的分布式数据集。

现在我们来谈谈窗口操作。关于窗口操作,有一个众所周知的警告:

WARN WindowExec:没有为Window操作定义分区!正在全部移动数据到单个分区,这可能会导致严重的性能堕落

这意味着我们在整个数据集上运行Window操作,而不是在分区的数据集上。看起来Spark绝对不能在不将所有数据移动到同一分区的情况下执行这样的命令。

最重要的是,这是我想填写的表格:

单分区操作的准备技术NO的行号是[/tr>
操作 通过设计加速
通过联接键联接 分区
groupBy带有一些聚合函数 按groupBy键分区
按分区 按分区键
没有分区的行数 -
按排序键对 <分区进行排序>
最小值/最大值 -
  • join-single partition operation by design:这也取决于数据。想象一下,如果您的联接键是高度偏斜的,或者它们都是相同的。所有将被带到单分区

  • 加入-prepartition technique to speed up:是的,您可以先重新分区,然后加入。但本质上,Spark无论如何都会进行重新分区,即使你不强制执行

  • groupBy-prepartition technique to speed up:不,这是错误的。它可能会减慢速度。groupBy首先在分区内聚合,然后对聚合的数据(较小的记录(进行混洗。如果你先手动分区,它会在没有聚合的情况下打乱所有数据,然后聚合

  • 带有分区的窗口-同样,如果数据高度倾斜或所有数据都是同一个键,则即使没有警告,它也会被带到单个分区。

类表可能是一个指导原则,但在大多数情况下,我们的逻辑处理取决于数据的性质。

相关内容

最新更新