[英]How to export a table dataframe in PySpark to csv?
我正在使用 Spark 1.3.1 (PySpark) 并且我已经使用 SQL 查询生成了一个表。 我现在有一个 object 是一个DataFrame
。 我想将这个DataFrame
object(我称之为“表”)导出到一个 csv 文件,这样我就可以操作它和 plot 列。 如何将DataFrame
“表”导出到 csv 文件?
谢谢!
如果数据帧适合驱动程序内存并且您想保存到本地文件系统,您可以使用toPandas
方法将Spark DataFrame转换为本地Pandas DataFrame ,然后简单地使用to_csv
:
df.toPandas().to_csv('mycsv.csv')
否则你可以使用spark-csv :
火花1.3
df.save('mycsv.csv', 'com.databricks.spark.csv')
火花 1.4+
df.write.format('com.databricks.spark.csv').save('mycsv.csv')
在 Spark 2.0+ 中你可以直接使用csv
数据源:
df.write.csv('mycsv.csv')
对于 Apache Spark 2+,为了将数据帧保存到单个 csv 文件中。 使用以下命令
query.repartition(1).write.csv("cc_out.csv", sep='|')
这里1
表示我只需要一个 csv 分区。 您可以根据自己的要求进行更改。
如果您不能使用 spark-csv,您可以执行以下操作:
df.rdd.map(lambda x: ",".join(map(str, x))).coalesce(1).saveAsTextFile("file.csv")
如果您需要处理带有换行符或逗号的字符串,这些字符串将不起作用。 用这个:
import csv
import cStringIO
def row2csv(row):
buffer = cStringIO.StringIO()
writer = csv.writer(buffer)
writer.writerow([str(s).encode("utf-8") for s in row])
buffer.seek(0)
return buffer.read().strip()
df.rdd.map(row2csv).coalesce(1).saveAsTextFile("file.csv")
您需要在单个分区中重新分区 Dataframe,然后以 Unix 文件系统格式定义文件的格式、路径和其他参数,然后就可以了,
df.repartition(1).write.format('com.databricks.spark.csv').save("/path/to/file/myfile.csv",header = 'true')
然而,重新分区是一个代价高昂的函数,而 toPandas() 是最糟糕的。 尝试在之前的语法中使用 .coalesce(1) 而不是 .repartition(1) 以获得更好的性能。
阅读有关重新分区与合并函数的更多信息。
这个怎么样(在你不想要一个单衬里)?
for row in df.collect():
d = row.asDict()
s = "%d\t%s\t%s\n" % (d["int_column"], d["string_column"], d["string_column"])
f.write(s)
f 是打开的文件描述符。 分隔符也是 TAB 字符,但很容易更改为您想要的任何内容。
'''
I am late to the pary but: this will let me rename the file, move it to a desired directory and delete the unwanted additional directory spark made
'''
import shutil
import os
import glob
path = 'test_write'
#write single csv
students.repartition(1).write.csv(path)
#rename and relocate the csv
shutil.move(glob.glob(os.getcwd() + '\\' + path + '\\' + r'*.csv')[0], os.getcwd()+ '\\' + path+ '.csv')
#remove additional directory
shutil.rmtree(os.getcwd()+'\\'+path)
尝试显示(df)并在结果中使用下载选项。 请注意:使用此选项只能下载 100 万行,但速度非常快。
使用 PySpark
在 Spark 3.0+ 中写入 csv 的最简单方法
sdf.write.csv("/path/to/csv/data.csv")
这可以根据您使用的火花节点的数量生成多个文件。 如果您想在单个文件中获取它,请使用重新分区。
sdf.repartition(1).write.csv("/path/to/csv/data.csv")
使用熊猫
如果你的数据不是太多,并且可以在本地python中保存,那么你也可以使用pandas
sdf.toPandas().to_csv("/path/to/csv/data.csv", index=False)
使用考拉
sdf.to_koalas().to_csv("/path/to/csv/data.csv", index=False)
我使用了 pandas 的方法,这给了我可怕的表现。 最后花了这么长时间,我停下来寻找另一种方法。
如果您正在寻找一种写入一个 csv 而不是多个 csv 的方法,这就是您正在寻找的:
df.coalesce(1).write.csv("train_dataset_processed", header=True)
它将处理我的数据集的时间从 2 小时以上减少到 2 分钟
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.