Pyspark:将df写入具有特定名称的文件,绘图df

时间:2017-06-19 15:01:16

标签: python apache-spark plot pyspark spark-dataframe

我正在使用最新版本的Spark(2.1.1)。我通过spark.read.csv读取了多个csv文件到dataframe。 使用此数据框处理后,如何将其保存到输出具有特定名称的csv文件。

例如,有100个输入文件(in1.csv,in2.csv,in3.csv,... in100.csv)。 属于in1.csv的行应保存为in1-result.csv。属于in2.csv的行应保存为in2-result.csv,依此类推。(默认文件名将类似于part-xxxx-xxxxx,不可读)

我见过partitionBy(col),但看起来它只能按列分区。

另一个问题是我想绘制我的数据帧。 Spark没有内置的绘图库。很多人使用df.toPandas()转换为pandas并绘制它。有没有更好的解决方案?由于我的数据非常大,toPandas()会导致内存错误。我正在服务器上工作,并希望将绘图保存为图像而不是显示。

1 个答案:

答案 0 :(得分:1)

我建议在以下解决方案中将DataFrame写入与输入文件相关的特定目录中:

    每个文件的循环
    • 阅读csv文件
    • 使用withColumn转换
    • 添加包含输入文件信息的新列
    • 使用union转换
    • 联合所有数据框架
  • 需要预处理
  • 通过为列提供输入文件信息,使用partitionBy保存结果,以便与同一输入文件相关的行将保存在同一输出目录中

代码可能如下所示:

all_df = None
for file in files: # where files is list of input CSV files that you want to read
    df = spark.read.csv(file)
    df.withColumn("input_file", file)
    if all_df is None:
        all_df = df
    else:
        all_df = all_df.union(df)

# do preprocessing

result.write.partitionBy(result.input_file).csv(outdir)