Scala 使用spark将大文件拆分为小文件并保存在不同路径中

Scala 使用spark将大文件拆分为小文件并保存在不同路径中,scala,apache-spark,Scala,Apache Spark,如何将大文件/RDD/DF拆分为小文件并保存到不同路径 例如:如果有一个文件在文本文件中包含用户名(单列),并希望将其拆分为N个文件,然后将这N个文件写入不同的目录 val x=20 val namesRDD=sc.textfile("readPath") val N = namesRDD.count/x 如何将namesRDD拆分为N个文件并将其写入某个“savepath/N/”—即第一个文件写入“savepath/1/”,第二个文件写入“savepath/2/”,依此类推。使用repart

如何将大文件/RDD/DF拆分为小文件并保存到不同路径

例如:如果有一个文件在文本文件中包含用户名(单列),并希望将其拆分为N个文件,然后将这N个文件写入不同的目录

val x=20
val namesRDD=sc.textfile("readPath")
val N = namesRDD.count/x

如何将namesRDD拆分为N个文件并将其写入某个“savepath/N/”—即第一个文件写入“savepath/1/”,第二个文件写入“savepath/2/”,依此类推。

使用
repartitionByRange
可以以这种方式拆分数据

例如:

df.repartitionByRange($"region").write.csv("data/regions")
这将为数据中显示的每个
区域创建一个零件文件。如果您有10个区域,您将有10个不同的
零件-
文件

如果要指定自己的名称,则必须使用
foreachPartition
应用自己的函数来保存文件

df.repartitionByRange($"region")
  .foreachPartition(region => {
     // custom implementation
  })

使用重新分区将文件/df拆分为N个部分(如果没有列可按range进行重新分区并希望随机拆分)

然后读取这些分区(在分区Df上执行任何操作)


for(我的repartitionByRange是否也可以使用Pyspark?我在2.3 Spark版本中找不到任何方法
df.repartition(N)
  .write.text(storePath)
  for (i <- 0 until N) {
    val parts = f"${i}%04d"
    val splitPath = s"${path}/part-0${partNumber}-*"
    //read data from the `splitPath`
  }