如何为PySpark的Window功能设置分区?

csh*_*in9 4 apache-spark apache-spark-sql pyspark google-cloud-dataproc

我正在运行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.
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

我的数据组织为:

A
B
A
C
D
Run Code Online (Sandbox Code Playgroud)

而且我要:

A,1
B,3
A,1
C,4
D,5
Run Code Online (Sandbox Code Playgroud)

我不认为应该只有.orderBy()来使用.partitionBy()。问题是,这似乎导致性能下降。没有Window功能,还有另一种方法可以实现这一点吗?

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

A,1
B,1
A,1
C,1
D,1
Run Code Online (Sandbox Code Playgroud)

我不要。

eli*_*sah 6

在给出问题信息的情况下,我最多只能提供有关如何在Window函数上定义分区的框架:

from pyspark.sql.window import Window

windowSpec = \
     Window \
     .partitionBy(...) \ # Here is where you define partitioning
     .orderBy(…)
Run Code Online (Sandbox Code Playgroud)

这等效于以下SQL:

OVER (PARTITION BY ... ORDER BY …)
Run Code Online (Sandbox Code Playgroud)

所以关于分区规范

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

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

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.
Run Code Online (Sandbox Code Playgroud)

  • 如果我想按整个表排序而不使用 .partitionBy() 怎么办?有没有更有效的方法来做到这一点?(即 RANK() OVER(ORDER BY ...) (2认同)
  • 如果我在整张桌子上排名,该如何划分?分区意味着我要对每个分区分别进行排名。 (2认同)