繁体   English   中英

如何将PySpark中的表dataframe导出到csv?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM