Python 在pyspark中链接多个groupBy

Python 在pyspark中链接多个groupBy,python,pyspark,rdd,Python,Pyspark,Rdd,我的数据如下所示: id | duration | action1 | action2 | ... --------------------------------------------- 1 | 10 | A | D 1 | 10 | B | E 2 | 25 | A | E 1 | 7 | A | G [(id=1,

我的数据如下所示:

   id | duration | action1 | action2 | ...
 ---------------------------------------------
    1 | 10       |   A     |   D
    1 | 10       |   B     |   E 
    2 | 25       |   A     |   E
    1 | 7        |   A     |   G
    [(id=1,
      ((duration=10,[(action1=A,action2=D),(action1=B,action2=E),
       (duration=7,(action1=A,action2=G)),

     (id=2,
       ((duration=25,(action1=A,action2=E)))]
我想按ID对其进行分组,这非常有效!:

df.rdd.groupBy(lambda x: x['id']).mapValues(list).collect()
现在,我想按持续时间对每组中的值进行分组,得到如下结果:

   id | duration | action1 | action2 | ...
 ---------------------------------------------
    1 | 10       |   A     |   D
    1 | 10       |   B     |   E 
    2 | 25       |   A     |   E
    1 | 7        |   A     |   G
    [(id=1,
      ((duration=10,[(action1=A,action2=D),(action1=B,action2=E),
       (duration=7,(action1=A,action2=G)),

     (id=2,
       ((duration=25,(action1=A,action2=E)))]

这里是我不知道如何做嵌套分组的地方。有什么提示吗?

不需要序列化到rdd。这里有一种通用方法,可以按多个列进行分组,并将其余列聚合到列表中,而无需对所有列进行硬编码:

从pyspark.sql.functions导入collect_列表 分组\u cols=[id,持续时间] other_cols=[c代表df.columns中的c,如果c不在分组_cols中] df.groupBygrouping\u cols.agg*[collect\u listc.aliasc for c in other\u cols].show +--+----+----+----+ |id |持续时间|行动1 |行动2| +--+----+----+----+ |1 | 10 |[A,B]|[D,E]| |2 | 25 |[A]|[E]| |1 | 7 |[A]|[G]| +--+----+----+----+ 更新

如果需要更改操作的顺序,最好的方法是使用带有orderBy的pyspark.sql.Window。这是因为groupBy是否遵循orderBy似乎存在一些模糊性

假设时间戳存储在ts列中。您应该能够执行以下操作:

从pyspark.sql导入窗口 w=Window.partitionBygrouping\u cols.orderByts 分组_df=df.select *分组\u列+[收集其他\u列中c的\u列表c.overv.aliasc] 不同的
不需要序列化到rdd。这里有一种通用方法,可以按多个列进行分组,并将其余列聚合到列表中,而无需对所有列进行硬编码:

从pyspark.sql.functions导入collect_列表 分组\u cols=[id,持续时间] other_cols=[c代表df.columns中的c,如果c不在分组_cols中] df.groupBygrouping\u cols.agg*[collect\u listc.aliasc for c in other\u cols].show +--+----+----+----+ |id |持续时间|行动1 |行动2| +--+----+----+----+ |1 | 10 |[A,B]|[D,E]| |2 | 25 |[A]|[E]| |1 | 7 |[A]|[G]| +--+----+----+----+ 更新

如果需要更改操作的顺序,最好的方法是使用带有orderBy的pyspark.sql.Window。这是因为groupBy是否遵循orderBy似乎存在一些模糊性

假设时间戳存储在ts列中。您应该能够执行以下操作:

从pyspark.sql导入窗口 w=Window.partitionBygrouping\u cols.orderByts 分组_df=df.select *分组\u列+[收集其他\u列中c的\u列表c.overv.aliasc] 不同的
这确实让我更接近我需要的地方!但是我可以在聚合列中排序吗?担心它会出问题。你能举个例子说明顺序的重要性吗?在action1列中,它可以是[A,B]或[B,A]。我想确保顺序由每个动作都有时间戳的字段保存。这有用吗?@ka_boom我添加了一些代码来维持秩序。我希望这能回答你的问题。@ka_boom,因为你说的是最后一行,我假设你的数据有明确的顺序。在这种情况下,只需过滤您的数据即可选择。有关更多详细信息,请创建一个新问题或编辑此问题,以包括一个演示您的问题并显示所需结果的问题。这确实让我更接近我需要的位置!但是我可以在聚合列中排序吗?担心它会出问题。你能举个例子说明顺序的重要性吗?在action1列中,它可以是[A,B]或[B,A]。我想确保顺序由每个动作都有时间戳的字段保存。这有用吗?@ka_boom我添加了一些代码来维持秩序。我希望这能回答你的问题。@ka_boom,因为你说的是最后一行,我假设你的数据有明确的顺序。在这种情况下,只需过滤您的数据即可选择。有关更多详细信息,请创建一个新问题或编辑此问题,以包括一个演示您的问题并显示所需结果的问题。