我正在学习火花。这是我的问题: 我有一个csv文件
a <- read.df(sqlContext,"./mine/a2014.csv","csv")
我想使用write.df存储此文件。但是,当我使用:
write.df(a,"mine/a.csv")
我得到一个名为a.csv的文件夹,其中根本没有csv文件。
是否有人可以帮助我?非常感谢!
答案 0 :(得分:1)
Spark将您的数据分区为块,因此它可以通过群集中的节点分发这些分区。在写入数据时,它会保留此分区:它会创建一个目录并将每个分区写入一个单独的文件。这样它可以更好地利用分布式文件系统(将每个块并行写入HDFS / S3),并且它不必将所有数据收集到可能无法处理该数量的单个机器上数据。
具有长名称的两个文件是数据的2个分区,并保存实际的CSV数据。您可以通过复制它们,使用.csv
扩展名重命名并双击它们,或使用head longfilename
之类的内容来查看此内容。
您可以通过尝试重新读取来测试写入是否成功:为Spark提供目录的路径,并通过您提到的元数据和_SUCCESS
文件将其识别为分区文件。 / p>
如果确实需要一个文件中的所有数据,可以使用repartition
将分区数量减少为1,然后将其写入:
b <- repartition(a, 1)
write.df(b,"mine/b.csv")
这将只生成一个长命名文件,该文件是包含所有数据的CSV文件。
(我没有使用SparkR这么未经测试;在Scala / PySpark中你更喜欢使用coalesce
而不是repartition
但我找不到等效的SparkR函数)< / p>