Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:如何将输出(saveAsTextFile)保存到大小相同的文件中?_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala Spark:如何将输出(saveAsTextFile)保存到大小相同的文件中?

Scala Spark:如何将输出(saveAsTextFile)保存到大小相同的文件中?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有以下代码,试图将RDD输出到1000个文件,文件大小相等。但是,我仍然只有70个输出文件,并且文件大小非常不同(范围从50M到2G)。为了使输出文件具有相同的大小,是否需要执行任何其他步骤?谢谢大家! val myRDD = input.flatMap { t => ??? } .reduceByKey { (t1, t2) => ??? ; t3 } .sortBy(-_._2.size)

我有以下代码,试图将RDD输出到1000个文件,文件大小相等。但是,我仍然只有70个输出文件,并且文件大小非常不同(范围从50M到2G)。为了使输出文件具有相同的大小,是否需要执行任何其他步骤?谢谢大家!

val myRDD = input.flatMap { t => ??? }
                 .reduceByKey { (t1, t2) => ??? ; t3 }
                 .sortBy(-_._2.size)
                 .repartition(1000)
                 .map(t => (t._1 + "_" + t._2.size, t._2.toString))

myRDD.saveAsTextFile("myOutput", classOf[GzipCodec])
您可以使用创建大小相等的分区,然后将tham另存为文本文件

示例取自:

import org.apache.spark.RangePartitioner;
var file=sc.textFile(“”)
var partitionedFile=file.map(x=>(x,1))
var data=partitionedFile.partitionBy(新的RangePartitioner(3,partitionedFile))
data.glom().collect()(0).length
data.glom().collect()(1).长度
data.glom().collect()(2).长度

在您的情况下,运行
saveAsTextFile()
应该足够了,而不是收集和检查长度。

这相当困难,您需要做的只是使用重新分区(1000) 您的文件大小将等于1000

您的代码已修改:

val myRDD = input.flatMap { t => ??? }
                 .reduceByKey { (t1, t2) => ??? ; t3 }
                 .sortBy(-_._2.size)
                 .repartition(1000)
                 .map(t => (t._1 + "_" + t._2.size, t._2.toString)).repartition(1000)

myRDD.saveAsTextFile("myOutput", classOf[GzipCodec])

你介意分享一个如何使用它的例子吗?谢谢我现在时间不多,所以我找到了一个现成的解决方案,请验证是否可以。
the following answer will solve your purpose

val myRDD = input.flatMap { t => ??? }
                 .reduceByKey { (t1, t2) => ??? ; t3 }
                 .sortBy(-_._2.size)
                 .repartition(1000)
                 .map(t => (t._1 + "_" + t._2.size, t._2.toString))

myRDD.repartition(1000).saveAsTextFile("myOutput", classOf[GzipCodec])

One thing to note that original rdd will have it's existance even after this because it is immutable 

or even you can use coalesce(1000) if you want to set max partitions to set