如何将大文件/ 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 /”,依此类推上。
答案 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`
}