Scala:如何根据行数将dataframe拆分为多个csv文件

Scala:如何根据行数将dataframe拆分为多个csv文件,scala,csv,apache-spark,dataframe,rdd,Scala,Csv,Apache Spark,Dataframe,Rdd,我有一个数据帧,比如说有10万行的df1。我想将相同的文件拆分为多个csv文件,每个文件有1M行。在scala中是否有类似的建议?您可以在数据帧上使用randomSplit方法 import scala.util.Random val df = List(0,1,2,3,4,5,6,7,8,9).toDF val splitted = df.randomSplit(Array(1,1,1,1,1)) splitted foreach { a => a.write.format("csv"

我有一个数据帧,比如说有10万行的df1。我想将相同的文件拆分为多个csv文件,每个文件有1M行。在scala中是否有类似的建议?

您可以在数据帧上使用randomSplit方法

import scala.util.Random
val df = List(0,1,2,3,4,5,6,7,8,9).toDF
val splitted = df.randomSplit(Array(1,1,1,1,1)) 
splitted foreach { a => a.write.format("csv").save("path" + Random.nextInt) }
我使用Random.nextInt来获得唯一的名称。如果需要,您可以在那里添加一些其他逻辑

资料来源:

编辑:另一种方法是使用limit和except:

var input = List(1,2,3,4,5,6,7,8,9).toDF
val limit = 2

var newFrames = List[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]]()
var size = input.count;

while (size > 0) {
    newFrames = input.limit(limit) :: newFrames
    input = input.except(newFrames.head)
    size = size - limit
}

newFrames.foreach(_.show)

结果列表中的第一个元素所包含的元素可能比列表中的其他元素少。

@Steffen。此外,csv中的记录数不是固定的。如果主文件有10M行,则应创建10个csv,每个csv包含1M条记录。同样,对于2000万条记录,应创建20条100万条记录的csv。这个例子不足以解决这个问题。这在scala代码中提供了一个如何实现这一点的示例。分区数应该是数据集的长度除以每个分区的行数。@Nitish I添加了一种方法,可以根据此问题的答案解决您的问题: