【问题标题】:How to use write.df store a csv file when using Sparkr and Rstudio?使用 Sparkr 和 Rstudio 时如何使用 write.df 存储 csv 文件?
【发布时间】:2016-09-20 11:46:53
【问题描述】:

我正在学习 Sparkr。我有一个 csv 文件:

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

我想用 write.df 来存储这个文件。但是,当我使用时:

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

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

【问题讨论】:

  • 文件夹中是否有文件,还是完全为空?
  • 文件夹 a.csv 包括 5 个文件:_common_metadata、_metadata、_SUCCESS 和另外两个名称很长的文件。但是它们都不能通过双击打开。当我尝试打开它们时,我得到了这样的信息:无法显示“_common_metadata”。该文件的类型未知。顺便一提。所有这一切都发生在使用 vm virtualbox 的 linux 上

标签: r apache-spark sparkr


【解决方案1】:

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

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

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

如果您确实需要一个文件中的所有数据,您可以使用repartition 将分区数量减少到1,然后写入:

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

这将产生一个长名称的文件,它是一个包含所有数据的 CSV 文件。

(我不使用未经测试的 SparkR;在 Scala/PySpark 中,您更愿意使用 coalesce 而不是 repartition,但我找不到等效的 SparkR 函数)

【讨论】:

  • 非常感谢您的回答。我学到了很多东西。只有一件事:当我尝试打开具有长名称的文件时。里面只有一堆废话。
  • 我现在看到 SparkR 在使用 write.df 时以 Parquet 格式写入数据帧。您必须专门指定以 CSV 格式写入。您可以尝试write.df(b,"mine/b.csv", "csv"),类似于您阅读它的方式,或者您可能必须指定完整的格式规范,如stackoverflow.com/a/34922656/1737727 中所述(同样,我自己实际上并不使用SparkR)。
  • 非常感谢!我仍然无法弄清楚这一点。但我知道如何使用 write.text 和 read.text 来做到这一点。所以没关系。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2017-02-26
相关资源
最近更新 更多