首页 文章

如何为PySpark设置Window函数的分区?

提问于
浏览
1

我正在运行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

我不想要的 .

1 回答

  • 4

    鉴于有关该问题的信息,我最多可以提供一个关于如何在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.
    

相关问题