如何使用Scala在文件中保存值

时间:2019-07-09 11:04:03

标签: scala apache-spark

我正在尝试在文件中保存一个值,但始终出现错误

我尝试过

.saveAsTextFile("/home/amel/timer")`

REDUCER功能

val startReduce = System.currentTimeMillis() 
val y = sc.textFile("/home/amel/10MB").filter(!_.contains("NULL")).filter(!_.contains("Null"))
val er = x.map(row => {
   val cols = row.split(",")
   (cols(1).split("-")(0) + "," + cols(2) + "," + cols(3), 1)
}).reduceByKey(_ + _).map(x => x._1 + "," + x._2)
er.collect.foreach(println)

val endReduce = System.currentTimeMillis()
val durationReduce = ((endReduce-startReduce)/1000).saveAsTextFile("home/amel/timer/")

我收到的错误在此行

val durationReduce = ((endReduce-startReduce)/1000).saveAsTextFile("home/amel/timer/")

它说:saveAsTextFile is not a member of Long

我想要的输出是数字

2 个答案:

答案 0 :(得分:2)

saveAsTextFile是类org.apache.spark.rdd.RDDdocs)上的方法

表达式((endReduce-startReduce)/1000)的类型为Long,因此它没有此方法,因此您看到的错误是“ saveAsTextFile is not a member of Long

此答案在这里适用:https://stackoverflow.com/a/32105659/8261

  

基本上情况是您有一个Int,并且想要将其写入文件。您首先想到的是在一组机器中创建一个分布式集合,该集合仅包含此Int,然后让这些计算机以分布式方式将Int写入一组文件中。

     

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

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

答案 1 :(得分:2)

Long没有名为saveAsTextFile的方法如果要编写Long值,有很多简单的方法是使用Java PrintWriter

val duration = ((endReduce-startReduce)/1000)
new PrintWriter("ome/amel/timer/time") { write(duation.toString); close }

如果您仍要使用spark RDD saveAsTextFile,则可以使用

sc.parallelize(Seq(duration)).saveAsTextFile("path")

但这只是写一个值没有意义。