5

我正在运行 PySpark 作业,并且收到以下消息:

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

该消息表示什么,以及如何为 Window 操作定义分区?

编辑:

我正在尝试对整个列进行排名。

我的数据组织为:

A
B
A
C
D

而且我要:

A,1
B,3
A,1
C,4
D,5

我认为不应该为此使用 .partitionBy(),只有 .orderBy()。问题是,这似乎会导致性能下降。有没有另一种方法可以在没有 Window 功能的情况下实现这一目标?

如果我按第一列分区,结果将是:

A,1
B,1
A,1
C,1
D,1

这是我不想要的。

4

1 回答 1

7

鉴于给出的问题信息,我充其量可以提供一个关于如何在Window 函数上定义分区的框架:

from pyspark.sql.window import Window

windowSpec = \
     Window \
     .partitionBy(...) \ # Here is where you define partitioning
     .orderBy(…)

这等效于以下 SQL:

OVER (PARTITION BY ... ORDER BY …)

所以关于分区规范

它控制哪些行将与给定行位于同一分区中。在排序和计算框架之前,您可能希望确保将所有具有相同分区列值的行收集到同一台机器上。

如果您不提供任何分区规范,则必须将所有数据收集到一台机器上,因此出现以下错误消息:

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
于 2016-04-05T20:17:46.850 回答