Python 3.x PySpark中的循环避免

Python 3.x PySpark中的循环避免,python-3.x,pyspark,Python 3.x,Pyspark,我有一个类似于以下内容的PySpark数据帧: ID | value | period a | 100 | 1 a | 100 | 1 b | 100 | 1 a | 100 | 2 b | 100 | 2 a | 100 | 3 对于每个周期(1、2、3)我想过滤周期小于或等于该数字的数据,然后对每个ID的值列求和 例如,周期1给出(a:200,b:100),周期2给出(a:300,b:200),周期3

我有一个类似于以下内容的PySpark数据帧:

ID | value | period
a  |  100  |   1   
a  |  100  |   1   
b  |  100  |   1   
a  |  100  |   2   
b  |  100  |   2   
a  |  100  |   3
对于每个周期
(1、2、3)
我想过滤周期小于或等于该数字的数据,然后对每个ID的值列求和

例如,周期1给出
(a:200,b:100)
,周期2给出
(a:300,b:200)
,周期3给出
(a:400,b:200)

目前,我正在做一个循环:

vals = [('a', 100, 1),
        ('a', 100, 1),
        ('b', 100, 1),
        ('a', 100, 2),
        ('b', 100, 2),
        ('a', 100, 3)]
cols = ['ID', 'value', 'period']
df = spark.createDataFrame(vals, cols)

for p in (1, 2, 3):
    df_filter = df[df['period'] <= p]
    results = df_filter.groupBy('ID').agg({'value':'sum'})
vals=[('a',100,1),
('a',100,1),
('b',100,1),
('a',100,2),
('b',100,2),
('a',100,3)]
cols=['ID','value','period']
df=spark.createDataFrame(VAL,cols)
对于(1,2,3)中的p:

df_filter=df[df['period']这里是一个使用
pyspark
pandas
的组合解决方案;既然您说了数百个周期,这可能是一个可行的解决方案;基本上先使用pyspark聚合数据帧,然后将其转换为本地pandas数据帧以进行进一步处理:

import pyspark.sql.functions as f

local_df = df.groupBy('period').pivot('ID').agg(f.sum('value')).toPandas()

local_df.sort_values('period').fillna(0).set_index('period').cumsum().reset_index()
#   period      a      b
#0       1  200.0  100.0
#1       2  300.0  200.0
#2       3  400.0  200.0