如何在pyspark dataframe中进行分组而不进行聚合

如何在pyspark dataframe中进行分组而不进行聚合,dataframe,apache-spark,pyspark,group-by,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Group By,Apache Spark Sql,我有一个非常大的数据集,我需要使用pyspark dataframe。请参阅数据的简化版本: product_type series_no product_amount date 514 111 20 2020/01/01 (YYYY/MM/DD) 514 111 30 2020/01/02 514 111

我有一个非常大的数据集,我需要使用pyspark dataframe。请参阅数据的简化版本:

product_type    series_no    product_amount    date
    514            111             20          2020/01/01 (YYYY/MM/DD)
    514            111             30          2020/01/02
    514            111             40          2020/01/03
    514            111             50          2020/01/04
    514            112             60          2020/01/01
    514            112             70          2020/01/02
    514            112             80          2020/01/03
我正在尝试使用(
产品类型
系列号
)对这些数据进行分组,以获得不进行聚合的数据组。对于此简化版本的数据,我们有两个组:

    group1:
    514            111             20          2020/01/01
    514            111             30          2020/01/02
    514            111             40          2020/01/03
    514            111             50          2020/01/04
    group2:
    514            112             60          2020/01/01
    514            112             70          2020/01/02
    514            112             80          2020/01/03
有没有办法用pyspark dataframe获取这些组。数据非常庞大,如果我将它们全部转换为python,就会抛出内存错误。我试图用下面给出的伪代码来表示组:

假设数据存储在df_all pyspark数据帧上

for group in df_all.groups:
    // convert to pandas dataframe.

请告诉我是否有任何有效的方法可以使用pyspark dataframe完成此操作。

您可以这样获得您的组。首先,收集
产品类型
系列号
列的不同值,然后循环这些值并过滤原始数据框:

for group in df_all.groups:
    // convert to pandas dataframe.
from pyspark.sql.functions import col

groups = list(map(
    lambda row: (row.product_type, row.series_no),
    df.select("product_type", "series_no").distinct().collect()
))

for group in groups:
    # replace here with your logic
    print(f"Group: product_type={group[0]} and series_no={group[1]}")
    df.filter((col("product_type") == group[0]) & (col("series_no") == group[1])).show()


#Group: product_type=514 and series_no=112
#+------------+---------+--------------+----------+
#|product_type|series_no|product_amount|      date|
#+------------+---------+--------------+----------+
#|         514|      112|            60|2020/01/01|
#|         514|      112|            70|2020/01/02|
#|         514|      112|            80|2020/01/03|
#+------------+---------+--------------+----------+

#Group: product_type=514 and series_no=111
#+------------+---------+--------------+----------+
#|product_type|series_no|product_amount|      date|
#+------------+---------+--------------+----------+
#|         514|      111|            20|2020/01/01|
#|         514|      111|            30|2020/01/02|
#|         514|      111|            40|2020/01/03|
#|         514|      111|            50|2020/01/04|
#+------------+---------+--------------+----------+

你说的“团体”是什么意思?请将预期结果添加为表格,如果仍然不清楚,请告诉我。为了清楚地解释,我添加了一些部分。非常感谢。这应该比使用groupBy更快、更经济吗@blackbishop@vr13实际上,我们无法进行比较,因为它不能取代groupBy。OP希望基于组将原始数据帧拆分为多个数据帧。与groupBy无关。