数据准备

allprovince.txtproduct.txt

需求一:统计没有农贸市场的省份有哪些?

  1. 对农产品数据进行处理(过滤脏数据)
  2. 对第一步处理后的数据列裁剪,只获取省份信息
  3. 对第二步获取到的所有省份信息去重
  4. 对省份数据与第三步获取到的去重的省份信息求差集,得到的就是没有农贸市场的省份
  1. package com.atguigu.demo
  2. import scala.io.Source
  3. /**
  4. * 需求一:统计没有农贸市场的省份有哪些?
  5. */
  6. object demo1 {
  7. def main(args: Array[String]): Unit = {
  8. //1.读取数据
  9. val allProvincesList = Source.fromFile("datas/allprovince.txt").getLines().toList
  10. val productList = Source.fromFile("datas/product.txt").getLines().toList
  11. //2.是否要过滤(脏数据),是否要去重,是否要列裁剪
  12. //2.1过滤脏数据
  13. val productFilterList = productList.filter(_.split("\t").size == 6)
  14. //2.2列裁剪[保留农产品数据的省份字段]
  15. val productSelectList = productFilterList.map(line => {
  16. val arr = line.split("\t")
  17. arr(4)
  18. })
  19. //2.3去重
  20. val disList = productSelectList.distinct
  21. //3.求差集
  22. val result = allProvincesList.diff(disList)
  23. //4.结果展示
  24. result.foreach(println(_))
  25. }
  26. }

$07[Scala练习] - 图1

需求二:获取农产品种类数最多的三个省份?

  1. 对农产品数据进行处理(过滤掉脏数据)
  2. 对第一步处理后的数据列裁剪,只保留农产品和省份信息
  3. 对第二步处理后的数据进行去重
  4. 对第三步处理后的数据按照省份进行分组(groupBy)
  5. 对第四步处理后的数据进行map,获取每个省份的农产品种类数
  6. 对第五步处理后的数据进行排序(取前三)
  1. package com.atguigu.demo
  2. import scala.io.Source
  3. /**
  4. * 需求二:获取农产品种类数最多的三个省份
  5. */
  6. object demo2 {
  7. def main(args: Array[String]): Unit = {
  8. //1.读取数据
  9. val productList = Source.fromFile("datas/product.txt").getLines().toList
  10. //2.过滤
  11. val filterList = productList.filter(_.split("\t").size == 6)
  12. //3.列裁剪[省份+菜名]
  13. val selectList = filterList.map(line => {
  14. val arr = line.split("\t")
  15. (arr(4), arr(0))
  16. })
  17. //4.去重[同一个省份有多个农贸市场可以卖同一种菜]
  18. val disList = selectList.distinct
  19. //5.按照省份分组
  20. val groupedMap = disList.groupBy({
  21. case (provice, name) => provice
  22. })
  23. //6.统计每个省份的菜的种类数
  24. val reduceList = groupedMap.map(x => {
  25. (x._1, x._2.length)
  26. })
  27. //7.排序获取前三
  28. val result = reduceList.toList.sortBy {
  29. case (provice, num) => num
  30. }.reverse.take(3)
  31. //8.结果展示
  32. result.foreach(print(_))
  33. }
  34. }

$07[Scala练习] - 图2

需求三获取每个省份农产品种类数最多的三个农贸市场?

  1. 统计每个省份每个农贸市场的菜的种类数
  2. 按照省份进行分组
  3. 对每个省所有农贸市场数据排序取前三
  1. package com.atguigu.demo
  2. import scala.io.Source
  3. /**
  4. * 需求三:获取每个省份农产品种类数最多的三个农贸市场
  5. */
  6. object demo3 {
  7. def main(args: Array[String]): Unit = {
  8. //1.读取数据
  9. val productList = Source.fromFile("datas/product.txt").getLines().toList
  10. //2.过滤脏数据
  11. val filterList = productList.filter(_.split("\t").size == 6)
  12. //3.列裁剪[省份,菜名,农贸市场]
  13. val selectList = filterList.map(line => {
  14. val arr = line.split("\t")
  15. (arr(4), arr(3), arr(0))
  16. })
  17. //4.去重[同一个农贸市场的多个摊位可能卖同一种菜]
  18. val disList = selectList.distinct
  19. //5.按照省份+农贸市场分组
  20. val pmGroupedMap = disList.groupBy({
  21. case (provice, market, name) => (provice, market)
  22. })
  23. //6.统计每个省份每个农贸市场的菜的种类数
  24. val pmNumList = pmGroupedMap.map(x => {
  25. (x._1, x._2.length)
  26. })
  27. //7.按照省份分组
  28. val proviceMap = pmNumList.groupBy({
  29. case ((provice, market), num) => provice
  30. })
  31. //8.对每个省所有农贸市场数据排序取前三
  32. val result = proviceMap.map(x => {
  33. val top3List = x._2.toList.sortBy {
  34. case ((provice, market), num) => num
  35. }.reverse.take(3)
  36. val top3 = top3List.map {
  37. case ((provice, market), num) => (market, num)
  38. }
  39. (x._1,top3)
  40. })
  41. //9.结果展示
  42. result.foreach(println(_))
  43. }
  44. }

$07[Scala练习] - 图3