import java.io.{File, PrintWriter}
import org.apache.spark.{SparkConf, SparkContext}
object AccumulatorApp {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("AccumulatorApp")
val sc = new SparkContext(sparkConf)
val accum1=sc.longAccumulator("totalaccumulator1")
val accum2=sc.longAccumulator("erroraccumulator")
val lines=sc.textFile("file:///C:\\Users\\HJ\\Desktop/secondhomework.txt")//读取输入文件
val templine=lines.map(x=>{
val temp=x.split("\t")
val domain=temp(0)
var response=0L
try{
accum1.add(1L)
response=temp(2).toLong}catch{
case e:Exception=>accum2.add(1L)
}
(domain,response)
})
val errorline=templine.filter((_._2==0))//.map(x=>(x._1,x._2.toString))
// 开始以为RDD[(String,Long)]类型无法用saveAsTextFile保存,所以就用map把第二位转为String,后来注释掉发现也可以
//可能是熬夜时候写的脑子糊掉了。。。
.saveAsTextFile("file:///C:\\Users\\HJ\\Desktop/text.txt")
val errortxt=new PrintWriter("C:/Users/HJ/Desktop/errortxt.txt")//用于保存脏数据记录数
val tatoltxt=new PrintWriter("C:/Users/HJ/Desktop/tatoltxt.txt")//用于保存总数据记录数
println(accum1.value)
println(accum2.value)
errortxt.println(accum2.value)
tatoltxt.println(accum1.value)
errortxt.close()
tatoltxt.close()
sc.stop()//最后一定要关掉
}
}
//注:计数器只有在触发action之后才会计数,更有趣的是,如果多次action,它得到的值是会翻倍的