我有一个数据帧,我打算在S3中写一个.csv文件 我使用以下代码:
df.coalesce(1).write.csv("dbfs:/mnt/mount1/2016//product_profit_weekly",mode='overwrite',header=True)
它将一个.csv文件放在product_profit_weekly文件夹中,目前.csv文件在S3中有一个已知的名称,我可以在编写时选择一个文件名吗?
答案 0 :(得分:3)
所有spark数据帧编写器(df.write .___)都不会写入单个文件,而是每个分区写一个块。我想你得到的是一个名为
的目录df.coalesce(1).write.csv("dbfs:/mnt/mount1/2016//product_profit_weekly
和一个名为
的文件part-00000
在这种情况下,您正在做一些非常低效且不太“闪亮”的事情 - 您将所有数据帧分区合并为一个,这意味着您的任务实际上并未并行执行!
这是一个不同的模型。利用所有火花并行化,这意味着不要合并,并且并行写入某个目录。
如果您有100个分区,您将获得:
part-00000
part-00001
...
part-00099
如果您需要一个平面文件中的所有内容,请编写一个小函数以在事后合并它。您可以在scala中执行此操作,也可以使用以下命令执行bash:
cat ${dir}.part-* > $flatFilePath