我们知道Spark中的一些操作可以并行执行。例如,当spark加入或分组数据集时,它是在重新洗牌后并行进行的。
其他操作可能可以并行进行:例如,简单的排序。我猜spark通过排序键重新排列数据,从而生成一个排序的分布式数据集。
现在我们来谈谈窗口操作。关于窗口操作,有一个众所周知的警告:
WARN WindowExec:没有为Window操作定义分区!正在全部移动数据到单个分区,这可能会导致严重的性能堕落
这意味着我们在整个数据集上运行Window操作,而不是在分区的数据集上。看起来Spark绝对不能在不将所有数据移动到同一分区的情况下执行这样的命令。
最重要的是,这是我想填写的表格:
操作 | 通过设计加速 | ||
---|---|---|---|
通过联接键联接 | 分区 | 否 | |
groupBy带有一些聚合函数 | 按groupBy键分区 | 否 | |
按分区 | 按分区键 | NO的行号 | |
没有分区的行数 | - | 是[/tr>||
按排序键对 | <分区进行排序>分区进行排序> | 否 | |
最小值/最大值 | - | 否 |
-
join-
single partition operation by design
:这也取决于数据。想象一下,如果您的联接键是高度偏斜的,或者它们都是相同的。所有将被带到单分区 -
加入-
prepartition technique to speed up
:是的,您可以先重新分区,然后加入。但本质上,Spark无论如何都会进行重新分区,即使你不强制执行 -
groupBy-
prepartition technique to speed up
:不,这是错误的。它可能会减慢速度。groupBy首先在分区内聚合,然后对聚合的数据(较小的记录(进行混洗。如果你先手动分区,它会在没有聚合的情况下打乱所有数据,然后聚合 -
带有分区的窗口-同样,如果数据高度倾斜或所有数据都是同一个键,则即使没有警告,它也会被带到单个分区。
类表可能是一个指导原则,但在大多数情况下,我们的逻辑处理取决于数据的性质。