将 pyspark groupedData 转换为 pandas DataFrame

Posted

技术标签:

【中文标题】将 pyspark groupedData 转换为 pandas DataFrame【英文标题】:Convert pyspark groupedData to pandas DataFrame 【发布时间】:2017-08-03 09:44:08 【问题描述】:

我需要通过 Spark 对我加载为两列 Pandas 数据框的大型数据集进行分组,然后重新转换为 Pandas:基本上是在执行 Pandas -> 'pyspark.sql.group.GroupedData' -> Pandas。 两列元素均为整数,分组后的数据需要以列表形式存储,如下:

df.a        df.b
1            3
2            5
3            8
1            2
3            1
2            6
...
spark_df = spark.createDataFrame(df)
spark_grouped_df = spark_df.groupBy('a')
type: <class 'pyspark.sql.group.GroupedData'>

此时,我需要像 Pandas df 这样的东西(之后我需要做其他对 Pandas 更友好的操作):

a        b
1    | [3,2]
2    | [5,6] 
3    | [8,1]
...

如果使用 pandas,我会这样做,但是太耗时了:

grouped_data = pd.DataFrame(df.groupby('a',as_index = True, sort = True)['b'].apply(list))

使用 Spark,我肯定会更快。

有什么提示吗? 谢谢!

【问题讨论】:

你查了吗pyspark.sql.DataFrame.toPandasspark.apache.org/docs/2.1.0/api/python/… @ MedAli 我检查了它,如果对象是 pyspark.sql.DataFrame,我可以使用它;从 groupby() 产生的一个是 pyspark.sql.group.GroupedData 类型 您可以将分组前的数据帧转换为熊猫,然后在熊猫中执行分组。 作为一般原则:当您的数据适合主内存时,Spark 将始终比 pandas(或任何其他“非大数据”框架)慢跨度> @csbr 您需要接受解决您问题的答案! 【参考方案1】:

您需要汇总分组数据。要获取输出格式,可以使用 collect_list 函数,

>>> from pyspark.sql.functions import collect_list
>>> pdf = spark_df.groupby('a').agg(collect_list('b').alias('b')).toPandas()
>>> pdf.head()
       a    b
    0  1  [3, 2]
    1  3  [8, 1]
    2  2  [5, 6]

【讨论】:

以上是关于将 pyspark groupedData 转换为 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

GroupedData 的长度“‘GroupedData’类型的对象没有 len()”

从 Spark GroupedData 对象中选择随机项

Pyspark:将 sql 查询转换为 pyspark?

将列表转换为 pyspark 数据框

将 pyspark 数据框转换为 python 字典列表

Pyspark:将 pyspark.sql.row 转换为 Dataframe