statCounter
org.apache.spark.util包中一个用于统计的类,这个类可以对一组数字进行统计追踪,可以统计他的计数,最大值,最小值,平均值,求和,以及可以合并两个追踪的结果merge。
example:统计一下不为0的数字和为0的数值的代码如下
package demo
import java.text.SimpleDateFormat
import java.util.Date
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.Calendar
import java.util.Locale
import java.time.temporal.ChronoUnit
import org.apache.spark.sql.SparkSession
import org.apache.spark.SparkConf
import java.io.File
import org.apache.spark.util.StatCounter
object Test {
def main(args: Array[String]): Unit = {
System.setProperty("hadoop.home.dir", "F:\\dependies\\winutils\\hadoop-2.7.1")
val conf = new SparkConf().setAppName("test").setMaster("local[2]")
val spark = SparkSession.builder()
.config(conf)
.enableHiveSupport()
.getOrCreate()
val data = spark.sparkContext.parallelize(Seq(1,5,63,1,6,0,54,74,874,4,0),2)
val res1 = data.map(myStatCount(_))
val res2 = res1.reduce((x,y)=>x.merge(y))
println
data.foreach(println)
res1.foreach(println)
println
println(res2)
}
class myStatCount extends Serializable{
val stats = new StatCounter()
var num_empty = 0L
def add(x:Double):myStatCount = {
if(x != 0) {
stats.merge(x)
} else {
num_empty = num_empty + 1
}
this
}
def merge(other:myStatCount):myStatCount= {
this.stats.merge(other.stats)
num_empty = other.num_empty + num_empty
this
}
override def toString()={
s"stats = ${stats.toString()},num_empty = ${num_empty.toString}"
}
}
object myStatCount extends Serializable{
def apply(x:Double)= new myStatCount().add(x)
}
}
这样就可以统计所有值为0的数据的个数。和值不为0的数据的最大值、最小值、平均值等