南山做网站教程,室内设计动态效果图制作,知名企业口号,php成品网站下载1 方法介绍
在 PySpark 中#xff0c;over 函数是一个非常重要的概念#xff0c;尤其是在使用窗口函数#xff08;例如 row_number, rank, dense_rank, lead, lag 等#xff09;时。over 函数允许你对一个数据集进行分组#xff0c;然后在每个分组内应用窗口函数。
1.1 …1 方法介绍
在 PySpark 中over 函数是一个非常重要的概念尤其是在使用窗口函数例如 row_number, rank, dense_rank, lead, lag 等时。over 函数允许你对一个数据集进行分组然后在每个分组内应用窗口函数。
1.1 基本概念 窗口函数 在 PySpark 中窗口函数是用于执行聚合和其他复杂操作的函数这些操作涉及到某种形式的分区和排序。 窗口函数不会导致行被折叠成单个输出行不像标准的聚合函数那样。相反它们会生成与输入行数相同的输出行数。 窗口规范Window Specification 在使用 over 函数时你需要定义一个窗口规范。这个规范描述了窗口函数的作用范围包括如何对数据进行分区partitioning、如何排序ordering以及是否有行或范围限制frame specification
1.2 over函数通常步骤
在 PySpark 中使用 over 函数通常涉及以下步骤 定义窗口规范 使用 Window 类来定义分区和排序规则。 例如Window.partitionBy(column1).orderBy(column2) 表示按 column1 进行分区并在每个分区内按 column2 排序。 应用窗口函数 窗口函数被应用于定义的窗口规范。例如F.row_number().over(windowSpec) 会在每个按 windowSpec 定义的窗口内对行进行编号。 在这里F.row_number() 是窗口函数而 .over(windowSpec) 则指定了这个函数应该如何在数据上操作。
2 举例
2.1 创建DataFrame 假设有一个如下的 DataFrame from pyspark.sql import Rowdata [Row(id1, GroupA,Value10),Row(id2, GroupA,Value20),Row(id3, GroupB,Value30),Row(id4, GroupB,Value40)
]df spark.createDataFrame(data)df.show()现在如果你想在每个 Group 内部对 Value 进行排名你可以使用 over 函数与 rank() 窗口函数结合来实现这一点
2.2 定义窗口规范
from pyspark.sql.window import Window
import pyspark.sql.functions as FwindowSpec Window.partitionBy(Group).orderBy(Value)
partitionBy(Group) 表示数据将根据 Group 列的值进行分区。在每个分区内数据行将独立于其他分区处理。
orderBy(Value) 指定了在每个分区内数据将根据 Value 列的值进行排序。注此时windowSpec 本身并不知道它将被应用于哪个 DataFrame。它只是定义了一个窗口规范2.3 应用窗口规范到 DataFrame
windowSpec 本身并不知道它将被应用于哪个 DataFrame。它只是定义了一个窗口规范。当在 df.withColumn 中使用 .over(windowSpec) 时就指定了在 df 上应用这个窗口规范。
df.withColumn(rank, F.rank().over(windowSpec)).show()
df.withColumn———— 创建了 df 的一个新版本其中包含了一个新列 rankF.rank().over(windowSpec) ————计算了一个窗口函数 rank该函数在 windowSpec 定义的每个分区内为每行分配一个排名