我正在运行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
我不想要。
答案 0 :(得分:5)
鉴于给出问题的信息,我最多可以提供一个关于如何在 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.