将 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.toPandas
spark.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的主要内容,如果未能解决你的问题,请参考以下文章