pyspark Window 窗口函数

参考:Introducing Window Functions in Spark SQL

窗口函数

At its core, a window function calculates a return value for every input row of a table based on a group of rows, called the Frame. Every input row can have a unique frame associated with it. This characteristic of window functions makes them more powerful than other functions and allows users to express various data processing tasks that are hard (if not impossible) to be expressed without window functions in a concise way.
个人理解:窗口函数主要作用是基于对列进行分组,
将函数作用于指定的行范围。函数的作用功能十分powerful!

关键

  • 分组 partitionBy
  • 排序 orderby
  • frame 选取 rangeBetween rowsBetween
    demo
tup = [(1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")]
df = spark.createDataFrame(tup, ["id", "category"])
df.show()
window = Window.partitionBy("category").orderBy(df.id.desc()).rangeBetween(Window.currentRow, 1)
df.withColumn("sum", F.sum("id").over(window)).show()

frame 选取

基准为当前行

  • 行数选择
    rowsBetween(x, y)
    Window.unboundedPreceding 表示当前行之前的无限行
    Window.currentRow 表示当前行
    Window.unboundedFollowing 表示当前行之后的无限行

rowsBetween(-1,1)
函数作用范围为当前行的上一行至下一行

  • 行范围设置 rangeBetween(x,y)
    基准为当前行的值
    rangeBetween(20,50)
    例如当前值为18
    则选取的值范围为[-2,68]

主要函数

API作用
rank
dense_rank
row_number
min
max
sum
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PySpark中的窗口函数是一种用于在数据集上进行聚合、排序和分析的强大工具。它们允许你在数据集的特定子集上执行聚合操作,而不需要将整个数据集加载到内存中。 在PySpark中使用窗口函数,你需要首先导入相关的模块: ```python from pyspark.sql import SparkSession from pyspark.sql.window import Window from pyspark.sql.functions import row_number, rank, dense_rank, percent_rank, first, last, lag, lead ``` 然后,你可以使用`Window.partitionBy()`方法指定一个或多个分区列,以确定窗口函数的作用范围。例如,假设你有一个名为`df`的数据集,包含`id`、`category`和`value`这三列,你可以按照`category`进行分区,并按照`value`进行排序: ```python windowSpec = Window.partitionBy("category").orderBy("value") ``` 接下来,你可以使用各种窗口函数对数据进行处理。以下是几个常用的窗口函数示例: - `row_number()`:为每个分区中的行分配唯一的序号。 - `rank()`:计算每个分区中行的排名(相同值得到相同的排名,下一个排名将被跳过)。 - `dense_rank()`:计算每个分区中行的密集排名(相同值得到相同的排名,下一个排名不会被跳过)。 - `percent_rank()`:计算每个分区中行的百分比排名。 - `first()`:返回每个分区中的第一行。 - `last()`:返回每个分区中的最后一行。 - `lag()`:返回当前行之前的指定偏移量的行。 - `lead()`:返回当前行之后的指定偏移量的行。 你可以使用这些窗口函数来创建新的列,例如: ```python from pyspark.sql.functions import sum, avg df.withColumn("row_number", row_number().over(windowSpec)) \ .withColumn("rank", rank().over(windowSpec)) \ .withColumn("dense_rank", dense_rank().over(windowSpec)) \ .withColumn("percent_rank", percent_rank().over(windowSpec)) \ .withColumn("sum_value", sum("value").over(windowSpec)) \ .withColumn("avg_value", avg("value").over(windowSpec)) \ .show() ``` 这将在原始数据集的基础上添加了几个新的列,并应用了各种窗口函数。 希望这能帮助到你!如果你有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值