【发布时间】:2018-06-06 08:02:04
【问题描述】:
我正在使用 Spark 2.3,我需要将 Spark Dataframe 保存到 csv 文件中,我正在寻找一种更好的方法来做到这一点。查看相关/类似问题,我发现 this one,但我需要更具体的:
如果 DataFrame 太大,如何避免使用 Pandas?因为我使用了toCSV() 函数(代码如下)并且它产生了:
内存不足错误(无法分配内存)。
使用文件 I/O 直接写入 csv 是更好的方法吗?它可以保留分隔符吗?
使用df.coalesce(1).write.option("header", "true").csv('mycsv.csv')会导致在每个文件中写入标题,当文件合并时,中间会有标题。我错了吗?
使用spark write 再使用hadoop getmerge 从性能上来说比使用coalesce 好?
def toCSV(spark_df, n=None, save_csv=None, csv_sep=',', csv_quote='"'):
"""get spark_df from hadoop and save to a csv file
Parameters
----------
spark_df: incoming dataframe
n: number of rows to get
save_csv=None: filename for exported csv
Returns
-------
"""
# use the more robust method
# set temp names
tmpfilename = save_csv or (wfu.random_filename() + '.csv')
tmpfoldername = wfu.random_filename()
print n
# write sparkdf to hadoop, get n rows if specified
if n:
spark_df.limit(n).write.csv(tmpfoldername, sep=csv_sep, quote=csv_quote)
else:
spark_df.write.csv(tmpfoldername, sep=csv_sep, quote=csv_quote)
# get merge file from hadoop
HDFSUtil.getmerge(tmpfoldername, tmpfilename)
HDFSUtil.rmdir(tmpfoldername)
# read into pandas df, remove tmp csv file
pd_df = pd.read_csv(tmpfilename, names=spark_df.columns, sep=csv_sep, quotechar=csv_quote)
os.remove(tmpfilename)
# re-write the csv file with header!
if save_csv is not None:
pd_df.to_csv(save_csv, sep=csv_sep, quotechar=csv_quote)
【问题讨论】:
-
如果你减少函数来表示你想要实现的基本功能,那会更有意义。当函数返回
pandas.core.frame.DataFrame时询问如何避免使用 Pandas 毫无意义。 -
函数目标是将 spark 数据帧保存到 csv 文件中。抱歉,我将删除返回。
标签: python pandas csv apache-spark