数据准备
allprovince.txtproduct.txt
需求一:统计没有农贸市场的省份有哪些?
- 对农产品数据进行处理(过滤脏数据)
- 对第一步处理后的数据列裁剪,只获取省份信息
- 对第二步获取到的所有省份信息去重
- 对省份数据与第三步获取到的去重的省份信息求差集,得到的就是没有农贸市场的省份
package com.atguigu.demoimport scala.io.Source/** * 需求一:统计没有农贸市场的省份有哪些? */object demo1 { def main(args: Array[String]): Unit = { //1.读取数据 val allProvincesList = Source.fromFile("datas/allprovince.txt").getLines().toList val productList = Source.fromFile("datas/product.txt").getLines().toList //2.是否要过滤(脏数据),是否要去重,是否要列裁剪 //2.1过滤脏数据 val productFilterList = productList.filter(_.split("\t").size == 6) //2.2列裁剪[保留农产品数据的省份字段] val productSelectList = productFilterList.map(line => { val arr = line.split("\t") arr(4) }) //2.3去重 val disList = productSelectList.distinct //3.求差集 val result = allProvincesList.diff(disList) //4.结果展示 result.foreach(println(_)) }}
![$07[Scala练习] - 图1](/uploads/projects/liuye-6lcqc@gws1uf/9f8ac2908f22b09ca712cf16e089cc97.png)
需求二:获取农产品种类数最多的三个省份?
- 对农产品数据进行处理(过滤掉脏数据)
- 对第一步处理后的数据列裁剪,只保留农产品和省份信息
- 对第二步处理后的数据进行去重
- 对第三步处理后的数据按照省份进行分组(groupBy)
- 对第四步处理后的数据进行map,获取每个省份的农产品种类数
- 对第五步处理后的数据进行排序(取前三)
package com.atguigu.demoimport scala.io.Source/** * 需求二:获取农产品种类数最多的三个省份 */object demo2 { def main(args: Array[String]): Unit = { //1.读取数据 val productList = Source.fromFile("datas/product.txt").getLines().toList //2.过滤 val filterList = productList.filter(_.split("\t").size == 6) //3.列裁剪[省份+菜名] val selectList = filterList.map(line => { val arr = line.split("\t") (arr(4), arr(0)) }) //4.去重[同一个省份有多个农贸市场可以卖同一种菜] val disList = selectList.distinct //5.按照省份分组 val groupedMap = disList.groupBy({ case (provice, name) => provice }) //6.统计每个省份的菜的种类数 val reduceList = groupedMap.map(x => { (x._1, x._2.length) }) //7.排序获取前三 val result = reduceList.toList.sortBy { case (provice, num) => num }.reverse.take(3) //8.结果展示 result.foreach(print(_)) }}
![$07[Scala练习] - 图2](/uploads/projects/liuye-6lcqc@gws1uf/f68d347a8afa8f1e60db4bd384dc2803.png)
需求三获取每个省份农产品种类数最多的三个农贸市场?
- 统计每个省份每个农贸市场的菜的种类数
- 按照省份进行分组
- 对每个省所有农贸市场数据排序取前三
package com.atguigu.demoimport scala.io.Source/** * 需求三:获取每个省份农产品种类数最多的三个农贸市场 */object demo3 { def main(args: Array[String]): Unit = { //1.读取数据 val productList = Source.fromFile("datas/product.txt").getLines().toList //2.过滤脏数据 val filterList = productList.filter(_.split("\t").size == 6) //3.列裁剪[省份,菜名,农贸市场] val selectList = filterList.map(line => { val arr = line.split("\t") (arr(4), arr(3), arr(0)) }) //4.去重[同一个农贸市场的多个摊位可能卖同一种菜] val disList = selectList.distinct //5.按照省份+农贸市场分组 val pmGroupedMap = disList.groupBy({ case (provice, market, name) => (provice, market) }) //6.统计每个省份每个农贸市场的菜的种类数 val pmNumList = pmGroupedMap.map(x => { (x._1, x._2.length) }) //7.按照省份分组 val proviceMap = pmNumList.groupBy({ case ((provice, market), num) => provice }) //8.对每个省所有农贸市场数据排序取前三 val result = proviceMap.map(x => { val top3List = x._2.toList.sortBy { case ((provice, market), num) => num }.reverse.take(3) val top3 = top3List.map { case ((provice, market), num) => (market, num) } (x._1,top3) }) //9.结果展示 result.foreach(println(_)) }}
![$07[Scala练习] - 图3](/uploads/projects/liuye-6lcqc@gws1uf/2c799289ec1a226af4354a3cdbea0da8.png)