Apache spark 如何将单个值存储在RDD中,还是绝对需要将其转换为数组?

Apache spark 如何将单个值存储在RDD中,还是绝对需要将其转换为数组?,apache-spark,Apache Spark,我有一个正在运行的程序,它对包含整数数组的输入RDD进行一系列转换。但在所有的转换完成之后,我只想找到所有这些数字的总和,只得到1个整数,并将该值存储在输出文件中 我可以通过对RDD执行reduce操作来获得最终整数值。但是,在执行此操作之后,我得到一个返回给我的整数(而不是RDD),因此我不能使用RDD.saveAsTextFile(“/output\u location”)方法 另外,当我尝试为该整数创建RDD时,它会给我一个错误: // finalvalue is my variable

我有一个正在运行的程序,它对包含整数数组的输入RDD进行一系列转换。但在所有的转换完成之后,我只想找到所有这些数字的总和,只得到1个整数,并将该值存储在输出文件中

我可以通过对RDD执行
reduce
操作来获得最终整数值。但是,在执行此操作之后,我得到一个返回给我的整数(而不是RDD),因此我不能使用
RDD.saveAsTextFile(“/output\u location”)
方法

另外,当我尝试为该整数创建RDD时,它会给我一个错误:

// finalvalue is my variable that contains the output value to be stored.
val out = sc.parallelize(finalvalue);
错误:
类型不匹配,应为Seq[notexperedt],实际值:Int


有人能告诉我为什么我不能把一个值存储到RDD中,还是必须把它转换成数组?

< P>所以,让我们考虑一下这个场景,同时理解一个步骤:

// Creating the RDD named x which stores 3 integers
scala> val x = sc.parallelize(Array(1,2,3))
x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:12

// Now calculating the sum converting it into an Integer and storing in mysum variable
scala> val mysum = x.sum().toInt
[Stage 1:>                                                                                                                       (0 + 0) / 2]mysum: Int = 6
  • 不知道为什么在我试图将字符串存储在磁盘上的最后一步出现警告

然后在上面提到的路径上创建一个目录,其中包含部分文件。

基本上,情况是您有一个
Int
,并且希望将其写入一个文件。您的第一个想法是跨计算机集群创建一个分布式集合,该集合只包含此
Int
,并让这些计算机以分布式方式将
Int
写入一组文件

我认为这不是正确的方法。不要使用Spark将
Int
保存到文件中。您可以使用
PrintWriter

val out = new java.io.PrintWriter("filename.txt")
out.println(finalvalue)
out.close()

这仅适用于写入本地文件。如果你想写HDFS。

sc.parallelize(mysum.toString)
-好主意!数字的每个数字都将在单独的一行上,这些行将分布在多个文件中。对于任何想使用结果的人来说,这是一个令人兴奋的难题。@Jordan;我已经尝试过使用.toString()方法,但它根本无法解决Daniel指出的问题。丹尼尔指出后我也检查了一下。我从我的同事那里听说的,并把它放在这里。但没有正确测试它的两位数。在这种情况下,数组方法可能是出路。感谢Jordan的数组方法。似乎我们只能使用序列或列表/数组作为sc.parallelize()方法的输入,而不仅仅是单个值。但是,我也想知道,如果有一种方法,我们可以只使用一个值来存储到RDD中,而不必将其转换为数组。将单个值转换为RDD没有任何理由也没有任何逻辑。您不应该忘记,使用分布式计算框架不允许您使用基本的编程知识,因此,我建议正确的答案是@DanielDarabos,用于一个值甚至一小部分变量的最佳实践。我投票支持这个答案,因为我发现创建RDD将单个值保存到文件中是一种滥用。
// So either do this
scala> val sumRDD = sc.parallelize(mysum.toString)
sumRDD: org.apache.spark.rdd.RDD[Char] = ParallelCollectionRDD[4] at parallelize at <console>:16

// or do this
scala> val sumRDD = sc.parallelize(Array(mysum))
sumRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[6] at parallelize at <console>:16
scala> sumRDD.saveAsTextFile("file:///home/hdfs/a12")
15/08/19 16:14:57 WARN DomainSocketFactory: The short-circuit local reads feature cannot be used because libhadoop cannot be loaded.
val out = new java.io.PrintWriter("filename.txt")
out.println(finalvalue)
out.close()