Scala - 将数据写入带有行限制的文件

时间:2016-09-28 09:33:16

标签: scala apache-spark

我有一个包含30万行数据的RDD,有没有办法将其保存到每个1M的文件中。

2 个答案:

答案 0 :(得分:0)

我认为他们没有直接的做法。您可以做的一件事是收集()您的rdd并从中获取迭代器并使用scala提供的正常文件保存来保存它。像这样的东西

val arrayValue = yourRdd.collect();
//Iterate the array and put it in file if it reaches the limit .

注意:如果您的数据大小为巨大,则不推荐使用此方法,因为collect()会将RDD的所有记录带到驱动程序代码(Master)。

答案 1 :(得分:0)

你可以rdd.repartition(30)。这将确保您的数据大致相等地划分为30个分区,并且应该为您提供每个大约1 Mil行的分区。

然后你做简单的rdd.saveAsTextFile(<path>),Spark将创建与<path>下的分区一样多的文件。或者,如果您想要更好地控制数据的保存方式和位置,您可以执行rdd.foreachPartition(f: Iterator[T] => Unit)并处理实际处理行的逻辑并保存,然后根据您认为适合传递给函数f的函数进行保存。 foreachPartition。 (请注意,foreachPartition将在每个执行程序节点上运行,并且不会将数据带回驱动程序,这当然是理想的事情。)