我有一个包含30万行数据的RDD,有没有办法将其保存到每个1M的文件中。
答案 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
将在每个执行程序节点上运行,并且不会将数据带回驱动程序,这当然是理想的事情。)