Scala:我如何根据行数将数据帧拆分为多个 csv 文件
Posted
技术标签:
【中文标题】Scala:我如何根据行数将数据帧拆分为多个 csv 文件【英文标题】:Scala: How so i split dataframe to multiple csv files based on number of rows 【发布时间】:2017-04-23 03:48:30 【问题描述】:我有一个数据框,说 df1 有 10M 行。我想将相同的内容拆分为多个 csv 文件,每个文件有 1M 行。有什么建议可以在 scala 中做同样的事情吗?
【问题讨论】:
【参考方案1】:您可以在 Dataframes 上使用 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 来获得一个唯一的名称。如有必要,您可以在此处添加一些其他逻辑。
来源:
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset
How to save a spark DataFrame as csv on disk?
https://forums.databricks.com/questions/8723/how-can-i-split-a-spark-dataframe-into-n-equal-dat.html
编辑:另一种方法是使用 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 有固定的行数。此外,如果 csv 中的记录不固定,则数量。如果主文件有 10M 行,则应创建 10 个 1M 记录的 csv。同样,对于 20M 记录,应创建 20 个 1M 记录的 csv。这个例子不足以解决这个问题。 ***.com/questions/41223125/… 这在 scala 代码中提供了如何执行此操作的示例。分区数应该是数据集的长度除以每个分区的行数。 @Nitish 我添加了一种方法,可以根据对以下问题的回答解决您的问题:***.com/questions/44135610/…以上是关于Scala:我如何根据行数将数据帧拆分为多个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章