簡體   English   中英

與groupBy聚合后將pyspark數據幀保存為CSV文件

[英]Saving pyspark dataframe after being aggregated with groupBy as csv file

我正在學習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

上面的答案是正確的,但是使用它的效果不是很好。
當然,您可以使用repartition(1)或coalesce(1),但這將導致將所有數據傳輸到單個工作程序中,並且會大大降低代碼速度。
為了避免這種情況,建議您對數據集中的某一列上的數據進行分區。 然后編寫簡單的代碼以每個分區獲取一個文件:

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

因此,數據將通過您的一列在工作人員之間進行分區,並且每個分區將僅獲得一個文件(以日期為例)。

Spark是一個分布式框架。 因此,幾個文件中的輸出是正常的行為……每個工作人員都會將其寫入,這會導致產生幾個小文件。

您可以使用以下命令來欺騙系統:

mpg_grp.coalesce(1).write.csv('mpg_grp.csv')

這將僅寫入1個文件(但仍在名為“ mpg_grp.csv”的文件夾中)。
注意:可能會很慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM