spark 学习笔记

来源:互联网 发布:陌声软件怎么样 编辑:程序博客网 时间:2024/05/17 03:40

最近使用spark简单的处理一些实际中的场景,感觉简单实用,就记录下来了。


场景运用

部门用户业绩表(1000w测试数据)

用户、部门、业绩
这里写图片描述

数据加载:

val conf = new SparkConf().setAppName("spark函数").setMaster("local")val context = new SparkContext(conf)var data = context.textFile("data.txt")

场景1:求每个部门的总业绩,并从大到小排序

data.map(_.split(",")).map(p => (p(1), p(2).toInt)).reduceByKey(_ + _).sortBy(_._2, false).foreach(println) //取出部门和业绩字段,对其进行按部门汇总,并进行排序即可。

场景2:求每个部门中业绩最高的人

data.map(_.split(",")).map(p => (p(0), p(1), p(2).toInt)).groupBy(_._2).map(p => (p._2.map(p => (p._1,p._3)).toArray.maxBy(_._2),p._1)).sortBy(p => p._1._2, false).map { case ((user, gz), dept) => user + "," + dept + "," + gz }.foreach(println)//step1:先对部门进行分组//step2:找出部门中最高业绩和人//step3:排序,并去除格式

加载用户订单表
用户、月份、订单
这里写图片描述

 var data1 = context.textFile("/userdt.txt")

场景3:求每季度的订单金额

data1.map(_.split(",")).map(p => {    if (p(1).toInt <= 3) {      (1, p(2).toInt)    } else if (p(1).toInt > 3 && p(1).toInt <= 6) {      (2, p(2).toInt)    } else if (p(1).toInt > 6 && p(1).toInt <= 9) {      (3, p(2).toInt)    } else {      (4, p(2).toInt)    }  }).reduceByKey(_ + _).foreach(println)  //这里用if else 对每季度进行了分组,应该可以用match匹配的,个人对match不熟。  //分完组,按组进行汇总即可

场景4:求用户每季度订单金额

data1.map(_.split(",")).map(p => {    if (p(1).toInt <= 3) {      (p(0), 1, p(2).toInt)    } else if (p(1).toInt > 3 && p(1).toInt <= 6) {      (p(0), 2, p(2).toInt)    } else if (p(1).toInt > 6 && p(1).toInt <= 9) {      (p(0), 3, p(2).toInt)    } else {      (p(0), 4, p(2).toInt)    }  }).groupBy(p => (p._1, p._2)).map(p => (p._1, p._2.map(p => p._3).reduce(_ + _)))    .map(p => (p._1._1, p._1._2, p._2)).sortBy(p => (p._1, p._2)).foreach(println) //这里只有月份,有年也是一样,先用filter过滤出那一年,再按季度进行汇总 //根据用户和季度进行分组,再用户和季度的组对金额进行汇总 //格式化数据,并按用户和季度排序

场景5:纬度关联,求全国各省份2015年各季度销售业绩

数据表
城市信息表(城市ID,城市,省份)
这里写图片描述

订单信息表(用户,年份,月份,城市ID,业绩)
这里写图片描述

  var cy = context.textFile("city.txt").map(_.split(",")).map(p => (p(0).toInt, p(2))).collect().toMap   //把城市ID和省份转化成map形式,方便获取  var dd = context.textFile("dingdan.txt").map{p=>    var sp=p.split(",")    var quarter=sp(2).toInt    if(quarter<=3){      quarter=1    }else if(quarter>3 && quarter<=6){      quarter=2    }else if(quarter>6 && quarter<=9){      quarter=3    }else{      quarter=4    }    ( sp(1),quarter, sp(3), sp(4))  }.filter(_._1.toInt.equals(2015))  //对月份按季度进行分组,并过滤出2015的订单 var data2 = dd.map(p => (p._1, p._2, cy.getOrElse(p._3.toInt,"其他"),p._4)).groupBy(p=>(p._1,p._2,p._3)) .map(p=>(p._1,p._2.map(_._4.toInt).reduce(_+_))).sortBy(p=>(p._1._3,p._1._1,p._1._2)).map{case ((year,quarter,area),num)=>area+","+year+","+quarter+","+num}.foreach(println)//step1:两表关联,订单的城市ID通过城市纬度表转换成省份//step2:对年份、季度、省份进行联合分组//step3:对订单金额进行合计,并按省份、年份、季度进行排序,格式化后输出

通过sqlContext(隐式转换的方式)来处理场景,这里只举一个例子

场景:求每个部门中业绩最高的人

val sqlContext=new SQLContext(context)  import  sqlContext.implicits._  //隐式转换case class  temptable(id:String,dept:String,sar:Int)var sql=data.map(_.split(",")).map(p=>temptable(p(0),p(1),p(2).toInt)).toDF()  sql.registerTempTable("deptinfo")val jh= sqlContext.sql("select a.id,a.sar,a.dept from deptinfo a INNER JOIN (select max(sar) aaa,dept from deptinfo group by dept)b on a.sar=b.aaa and a.dept=b.dept    order by a.sar ")jh.foreach(println)//把内容转换成临时表,并通过sql直接编写
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东退货卖家拒收怎么办 京东退货被卖家拒收怎么办 期货平台跑路了怎么办 浮云牧场没房了怎么办 融资股票停牌了怎么办 买入的股票停牌怎么办 淘宝抢到便宜货老板不发货怎么办 微信代购买到假货了怎么办 微信代购收到假货怎么办 苹果商店下载很慢怎么办 谷歌商店下载东西慢怎么办 买家说少发货了怎么办 人肉代购被海关扣了怎么办 韩国代购被海关扣了怎么办 爱奇艺开通自动续费忘了账号怎么办 小米手机云储存空间不足怎么办 路由器被黑了打不开网页怎么办 致人轻伤跑了怎么办 轻伤对方要30万怎么办 老公用老婆的钱怎么办 想注册个公司要怎么办 域名续费不知道找谁怎么办 代收快递弄丢了怎么办 货到付款的快递人不在怎么办 快递送货上门人不在怎么办 ems快递签收人不在怎么办 快递被别人取了怎么办 怎么办快递宗和收发点 快递电话写错了怎么办 网上买沙发想退货怎么办 买的电脑想退货怎么办 买了衣服想退货怎么办 天猫买药审核通过后不要了怎么办 京东维修无发票怎么办 京东维修没有发票怎么办 苹果6s外音没了怎么办 苹果6splus开不了机怎么办 顺丰快递寄件填错收件人地址怎么办 收快递电话换了怎么办 顺丰快递没人收怎么办 网购东西没收到怎么办