Scala保存数值到文件报错:saveAsTextFile非Long类型成员
问题分析与解决方法
你遇到的错误原因很清晰:saveAsTextFile是Spark RDD专属的方法,但你试图直接在一个普通的Long类型数值上调用它——(endReduce-startReduce)/1000计算出来的是单一的长整数,并不是RDD对象,自然会触发saveAsTextFile is not a member of Long的报错。
具体解决步骤
要保存这个单个耗时数值,你需要先把它转换成包含该数值的RDD,再调用保存方法:
- 先单独计算出耗时结果:
val durationReduce = (endReduce - startReduce) / 1000
- 使用SparkContext的
parallelize方法,把这个数值包装成仅含一个元素的RDD,再执行保存:
sc.parallelize(Seq(durationReduce)).saveAsTextFile("/home/amel/timer/")
⚠️ 注意路径要写完整:开头的斜杠/不能省略,否则会被识别为相对路径,可能导致文件保存到错误位置。
修正后的完整Reducer代码片段
val startReduce = System.currentTimeMillis() val y = sc.textFile("/home/amel/10MB").filter(!_.contains("NULL")).filter(!_.contains("Null")) // 注意:这里的x变量需要确保是已定义的RDD(如果是笔误建议改成y) 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 // 保存耗时数值 sc.parallelize(Seq(durationReduce)).saveAsTextFile("/home/amel/timer/")
修改后,Spark会把你期望的耗时数字保存到指定路径下的文件中,文件内容就是这个单一数值。
内容的提问来源于stack exchange,提问作者Amel ha
相关产品推荐
相关产品推荐

