使用streaming window函数统计用户不同时间段平均消费金额等指标
来源:互联网 发布:cad迷你看图mac破解版 编辑:程序博客网 时间:2024/04/26 06:17
场景
现在餐厅老板已经不满足仅仅统计历史用户消费金额总数了,他想知道每个用户半年,每个月,每天,或者一小时消费的总额,来店消费的次数以及平均金额。
给出的例子计算的是每5秒,每30秒,每1分钟的用户消费金额,消费次数,平均消费。
数据格式
{"user":"zhangsan","payment":8}{"user":"wangwu","payment":7}....
制作kafka输入数据
与我上篇文章相同
参考这里
处理流程
package StreamingTest/** * Created by liangshiwei on 15/9/9. */import net.liftweb.json._import org.apache.spark.SparkConfimport org.apache.spark.streaming.dstream.DStreamimport org.apache.spark.streaming.kafka.KafkaUtilsimport org.apache.spark.streaming.{Seconds, StreamingContext}object WindowsFunction { //利用用户消费金额总和计算结果以及用户消费次数统计计算结果计算平均消费金额 def avgFunction(sum:DStream[(String,Double)],count:DStream[(String,Int)]): DStream[(String,Double)] = { val payment = sum.join(count).map(r => { val user = r._1 val sum = r._2._1 val count = r._2._2 (user,sum/count) }) payment } def main (args: Array[String]) { def functionToCreateContext(): StreamingContext = { val conf = new SparkConf().setAppName("test").setMaster("local[*]") val ssc = new StreamingContext(conf, Seconds(5)) val zkQuorum = "192.168.6.55:2181,192.168.6.56:2181,192.168.6.57:2181" val consumerGroupName = "user_payment" val kafkaTopic = "user_payment" val kafkaThreadNum = 1 val topicMap = kafkaTopic.split(",").map((_, kafkaThreadNum.toInt)).toMap val user_payment = KafkaUtils.createStream(ssc, zkQuorum, consumerGroupName, topicMap).map(x=>{ parse(x._2) }) //计算每5s每个用户的消费总和 val paymentSum = user_payment.map(jsonLine =>{ implicit val formats = DefaultFormats val user = (jsonLine \ "user").extract[String] val payment = (jsonLine \ "payment").extract[String] (user,payment.toDouble) }).reduceByKey(_+_) //输出结果 paymentSum.print() //计算每5s每个用户的消费次数 val paymentCount = user_payment.map(jsonLine =>{ implicit val formats = DefaultFormats val user = (jsonLine \ "user").extract[String] (user,1) }).reduceByKey(_+_)// paymentCount.print() //计算每5s每个用户平均的消费金额 val paymentAvg = avgFunction(paymentSum,paymentCount)// paymentAvg.print() //窗口操作,在其中计算不同时间段的结果,入库的话根据使用场景选择吧 def windowsFunction() { //每5秒计算最后30秒每个用户消费金额 val windowSum_30 = paymentSum.reduceByKeyAndWindow((a: Double, b: Double) => (a + b),_-_, Seconds(30), Seconds(5))// windowSum_30.print() //每5秒计算最后30秒每个用户消费次数 val windowCount_30 = paymentCount.reduceByKeyAndWindow((a: Int, b: Int) => (a + b),_-_, Seconds(30), Seconds(5))// windowCount_30.print() //每5秒计算最后30秒每个用户平均消费 val windowAvg_30 = avgFunction(windowSum_30,windowCount_30)// windowAvg_30.print() //每5秒计算最后60秒每个用户消费金额 val windowSum_60 = windowSum_30.reduceByKeyAndWindow((a:Double,b:Double)=>(a+b),_-_,Seconds(10),Seconds(5))// windowSum_60.print() //每5秒计算最后60秒每个用户消费次数 val windowCount_60 = windowCount_30.reduceByKeyAndWindow((a:Int,b:Int) => (a+b),_-_,Seconds(10),Seconds(5))// windowCount_60.print() //每5秒计算最后60秒每个用户平均消费 val windowAvg_60 = avgFunction(windowSum_60,windowCount_60)// windowAvg_60.print } windowsFunction() ssc } val context = StreamingContext.getOrCreate("checkPoint", functionToCreateContext _) context.start() context.awaitTermination() }}
结果节选
实际效果你们自己去体验吧
//-----------消费总额-------(zhangsan,146.0)(lisi,79.0)(wangwu,99.0)(zhaoliu,115.0)//-----------消费次数-------(zhangsan,32)(lisi,18)(wangwu,30)(zhaoliu,24)//-----------平均消费-------(zhangsan,4.5625)(lisi,4.388888888888889)(wangwu,3.3)(zhaoliu,4.791666666666667)
0 0
- 使用streaming window函数统计用户不同时间段平均消费金额等指标
- spark streaming - kafka updateStateByKey 统计用户消费金额
- Spark Streaming消费kafka,不同topic-join实时统计
- 使用静态成员函数统计平均成绩
- SQL:根据消费类型不同统计人次
- SQL练习 demo5_function_大小平均总和及统计等主函数
- 利用Redis BitMap 统计用户活跃指标
- Java 基于Spring、MyBatis使用HashMap统计不同国家、指定类型船舶指定时间段在某区域进出量计算方法
- MySQL统计函数记录——时间段统计
- MySQL统计函数记录——时间段统计
- JSTL常用函数(金额,日期格式化等)
- Spark Streaming从Kafka中拉取数据,并且使用过“窗口函数”统计一些流量信息
- devexpress表格gridcontrol实现列统计,总计,平均,求和等。
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- 策略模式---计算消费金额
- 使用redis如何实现动态时间段内统计排序?
- 清除Eclipse/MyEclipse下的svn账号密码
- 文章标题
- 机器人坐标变换(一)
- cocoapods 出现Error:ENOENT -No such file or directory的解决方法
- “服务器推”技术的应用
- 使用streaming window函数统计用户不同时间段平均消费金额等指标
- 一个比较完整的Inno Setup 安装脚本 - 增加了对ini文件设置的功能
- DM9000网卡驱动
- codeforces 317 B. Minimization
- Linux 开放指定端口
- 详解java中的HashMap
- WinCE6.0BSP移植(二)
- 后缀树系列二:线性时间内构建后缀树(包含代码实现)
- Codeforces 383A Milking cows