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 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何根据原始数据帧中的总行数将数据帧拆分为两个数据帧

如何在限制行数的同时拆分 Pyspark 数据帧?

根据 NaN 值将数据帧拆分为多个数据帧

根据单元格原始列的行数将特定单元格的内容复制到空列

如何根据字节大小拆分熊猫数据帧

如何使用 R 中的条件语句将数据帧拆分为多个数据帧