python - 根据 pyspark 中一列的变化增加每个分区中的值
问题描述
我想为 PySpark DataFrame 中的每个分区创建一个新列(数字),当列年份发生更改时,该列会递增。
原始数据:
name period year
A 1 2010
A 1 2010
A 1 2011
A 1 2013
B 1 2018
B 1 2019
C 2 2018
C 2 2018
C 2 2019
预期输出:
name period year number
A 1 2010 1
A 1 2010 1
A 1 2011 2
A 1 2013 3
B 1 2018 1
B 1 2019 2
C 2 2018 1
C 2 2018 1
C 2 2019 2
解决方案
创建您提供的示例数据框:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window
data = [{"name":'A', "period":1, "year":2010},
{"name":'A', "period":1, "year":2010},
{"name":'A', "period":1, "year":2011},
{"name":'A', "period":1, "year":2013},
{"name":'B', "period":1, "year":2018},
{"name":'B', "period":1, "year":2019},
{"name":'C', "period":2, "year":2018},
{"name":'C', "period":2, "year":2018},
{"name":'C', "period":2, "year":2019}]
df = spark.createDataFrame(data)
使用窗口函数对数据帧进行分区,然后根据该分区进行dense_rank:
window = (Window.partitionBy('name').orderBy(F.col('year').asc()))
df = df.withColumn('number', F.dense_rank().over(window)).orderBy("name", "year")
结果:
推荐阅读
- cluster-computing - snakemake 在 SGE 上提交具有多个通配符的作业的问题
- dynamics-crm - 在 D365 Online 中的 SiteMap Html Web 资源上未定义 Xrm 对象
- javascript - Javasript :TypeError: input.value 未定义
- python-3.x - 对象的比较方法
- reactjs - 在 redux-saga 中获取 api 数据
- javascript - React redux - 在提供程序之外的 App.js 中分派?
- kotlin - 如何使用 kotlinx 序列化使用 open val 序列化 kotlin 密封类
- typescript - 打字稿:对象分配不按预期工作
- android - 如何让aab格式支持更多设备
- azure-devops - 使用个人访问令牌将 Azure DevOps 部署到 VM