与groupBy聚合后将pyspark数据帧保存为CSV文件

时间:2019-02-07 08:00:44

标签: python pandas pyspark pyspark-sql

我正在学习pyspark,我对如何将分组数据帧另存为csv文件感到有些困惑(假设出于某些原因(例如RAM限制),我不想先将其转换为Pandas数据帧)。

有关可重现的示例:

import seaborn as sns
import findspark
findspark.init()
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master('local') \
.appName('Data cleaning') \
.getOrCreate()
from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
from pyspark.sql.functions import *

mpg= sns.load_dataset('mpg')
mpg_sp = spark.createDataFrame(mpg)
mpg_grp = mpg_sp.groupBy('model_year', 'origin').avg('displacement', 'weight')

# The command below fails in the sense that it creates a folder with multiple  files in it rather than a single csv file as I would expect

mpg_grp.write.csv('mpg_grp.csv')

# By applying the collect method I get a list which can not be saved as a csv file

mpg_grp1 = mpg_grp.collect()
type(mpg_grp1)
list

2 个答案:

答案 0 :(得分:1)

以上答案是正确的,但使用效果不佳。
当然,您可以使用repartition(1)或coalesce(1),但这将导致将所有数据传输到单个工作程序中,并大大降低代码的速度。
为了避免这种情况,建议您对数据集中的某一列上的数据进行分区。然后编写简单的代码以每个分区获取一个文件:

cols = ["$name"]
mpg_grp.repartition(cols).write.partitionBy(cols).csv("$location")

因此,数据将通过您的一列在工作人员之间进行分区,并且每个分区上您将只得到一个文件(以日期为例)。

答案 1 :(得分:0)

Spark是一个分布式框架。因此,几个文件中的输出是正常的行为……每个工作人员都会将其写入,这会导致产生几个小文件。

您可以使用此命令来欺骗系统:

x.operator bool()

这将仅写入1个文件(但仍在名为“ mpg_grp.csv”的文件夹中)。
警告:这可能会很慢。

相关问题