2016-05-23 79 views
0

我正在学习sparkr。这里是我的问题: 我有一个CSV文件如何在使用sparkr,rstudio时使用write.df存储csv文件?

a <- read.df(sqlContext,"./mine/a2014.csv","csv") 

我想用write.df保存此文件。但是,当我使用:

write.df(a,"mine/a.csv") 

我得到一个名为a.csv,其中根本没有csv文件的文件夹。

有没有人可以帮助我?非常感谢!

+0

是否有该文件夹中的所有文件,或它完全是空的吗? – sgvd

+0

文件夹a.csv包含5个文件:_common_metadata,_metadata,_SUCCESS和另外两个名字很长的文件。但是没有一个可以通过双击打开。当我尝试打开它们时,我得到了如下信息:无法显示“_common_metadata”。该文件是未知类型的文件。顺便一提。所有这些都发生在linux上使用虚拟机virtualbox –

回答

1

Spark将您的数据分成块,因此它可以将这些分区分布到群集中的节点上。在写入数据时,它保留了这种分区:它创建一个目录并将每个分区写入一个单独的文件。这样,它可以更好地利用分布式文件系统(将每个块并行写入HDFS/S3),并且不必将所有数据收集到可能无法处理大量数据的单台机器。

名称长的两个文件是数据的两个分区,它们包含实际的CSV数据。您可以通过复制它们来看到这一点,使用.csv扩展名重命名副本并双击它们,或者使用head longfilename之类的东西。

您可以通过尝试读取它来测试写入是否成功:给Spark指定目录的路径,并通过您提到的元数据和_SUCCESS文件将它识别为分区文件。

如果你需要在一个文件中的所有数据,你可以通过使用repartition给分区的数量减少到1,然后写:

b <- repartition(a, 1) 
write.df(b,"mine/b.csv") 

这将导致在短短的一个长命名文件,它是一个包含所有数据的CSV文件。

(我不使用SparkR所以未经考验;在斯卡拉/ PySpark你宁愿用​​3210而非repartition,但我找不到等效SparkR功能)

+0

非常感谢你的回答。我学到了很多。只有一件事:当我尝试用长名称打开文件时。其中只有一堆无意义的人物。 –

+0

我现在看到SparkR在使用'write.df'时以Parquet格式写入数据帧。您必须指定专门以CSV格式写入。您可以尝试'write.df(b,“mine/b.csv”,“csv”)',类似于您如何阅读它,或者您可能需要指定完整格式规范,如http:// stackoverflow中所述。 com/a/34922656/1737727(我自己实际上并没有真正使用SparkR)。 – sgvd

+0

非常感谢!我仍然无法弄清楚这一点。但我知道如何使用write.text和read.text来做到这一点。所以没关系。 –