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

时间:2018-07-17 17:51:15

标签: scala apache-spark

如何将大文件/ RDD / DF拆分为小文件并保存到其他路径。

ex:如果文本文件中有一个包含用户名(单列)的文件,并且想要将其拆分为N个文件,然后将该N个文件写入不同的目录中。

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

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

2 个答案:

答案 0 :(得分:0)

使用repartitionByRange将使您以这种方式拆分数据。

示例:

df.repartitionByRange($"region").write.csv("data/regions")

这将为数据中出现的每个region创建一个零件文件。如果您有10个区域,则将有10个不同的part-文件。

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

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

答案 1 :(得分:0)

使用repartition将文件/ df拆分为N个部分(如果没有要执行repartitionByRange的列并且想要随机拆分)

df.repartition(N)
  .write.text(storePath)

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

  for (i <- 0 until N) {
    val parts = f"${i}%04d"
    val splitPath = s"${path}/part-0${partNumber}-*"
    //read data from the `splitPath`
  }