SPARK——哪个省份的销售额最多


前言

提示:如有不对,请多多指教

我做的内容是哪个省份的销售额最多,由于我的电脑数据库坏了,打不开数据库,即使以管理员身份运行也不能打开,加上数据库比较大,而且目前也已经在上班了,时间不是很充裕,拷贝舍友的数据库也不太现实,所以我读取的技术是去问了其他同学,数据源是上学期数据可视化杨老师上课用的数据。

数据库损坏

尝试过以管理员身份运行但是还是不能够打开数据库
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、导入SPARK相关数据类

import org.apache.poi.ss.usermodel.{CellType, WorkbookFactory}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
import java.io.FileInputStream
import scala.collection.JavaConverters.asScalaIteratorConverter

二、创建项目

1.创建 SparkConf 并设置应用名称

object ProvinceTop10 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("ProvinceTop10").setMaster("local[*]") // 创建 Sparkonf 对象,设置应用名称和运行模
    val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate() // 创建 SparkSession 对象

2.设置读取数据文件的路径

val filePath = "datas/datas.xlsx"

3.使用 POI 库读取 XLSX 文件

    val workbook = WorkbookFactory.create(new FileInputStream(filePath))
    val sheet = workbook.getSheetAt(0) // 获取工作表,假设数据在第一个工作表

4.读取数据并将其存储为 Seq[List[string]] 数据结构

    val data: Seq[List[String]] = sheet.iterator().asScala.toSeq
      .map(row => row.iterator().asScala.zipWithIndex.map {
        case (cell, index) =>
          if (index == 1 && cell.getCellType == CellType.NUMERIC) {
          // 假设第二列的数字值表示日期
            val dateValue = cell.getNumericCellValue.toLong
            val formattedDate = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(dateValue)
            new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(formattedDate)
          } else cell.toString
      }.toList)

5.创建 Spark RDD 以便进一步处理

val ListRdd = spark.sparkContext.parallelize(data)

6.提取特定列数据,例如省份和总价格

    val ProvinceRdd: RDD[(String, Float)] = ListRdd.map(
      data => (data(2), data(6).toFloat)
    )

7.对省份进行归并并计算总销售额

val reduceRDD: RDD[(String, Float)] = ProvinceRdd.reduceByKey(_ + _)

8.对总销售额进行降序排序

val sortASCRDD: RDD[(String, Float)] = reduceRDD.sortBy(_._2, ascending = false)

9.获取前十个省份和其总销售额

val resultArray1: Array[(String, Float)] = sortASCRDD.take(10)

10.打印结果

print(resultArray1.mkString("\n"))

11.停止 SparkSession

spark.stop()

所有代码展示

import org.apache.poi.ss.usermodel.{CellType, WorkbookFactory}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

import java.io.FileInputStream
import scala.collection.JavaConverters.asScalaIteratorConverter

object ProvinceTop10 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("ProvinceTop10").setMaster("local[*]")
    val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()

    val filePath = "datas/datas.xlsx"

    val workbook = WorkbookFactory.create(new FileInputStream(filePath))
    val sheet = workbook.getSheetAt(0)

    val data: Seq[List[String]] = sheet.iterator().asScala.toSeq
      .map(row => row.iterator().asScala.zipWithIndex.map {
        case (cell, index) =>
          if (index == 1 && cell.getCellType == CellType.NUMERIC) {
            val dateValue = cell.getNumericCellValue.toLong
            val formattedDate = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(dateValue)
            new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(formattedDate)
          } else cell.toString
      }.toList)

    val ListRdd = spark.sparkContext.parallelize(data)

    val ProvinceRdd: RDD[(String, Float)] = ListRdd.map(
      data => (data(2), data(6).toFloat)
    )

    val reduceRDD: RDD[(String, Float)] = ProvinceRdd.reduceByKey(_ + _)

    val sortASCRDD: RDD[(String, Float)] = reduceRDD.sortBy(_._2, ascending = false)

    val resultArray1: Array[(String, Float)] = sortASCRDD.take(10)

    print(resultArray1.mkString("\n"))

    spark.stop()
  }
}

运行结果展示

在这里插入图片描述


三、总结

本次项目遇到的最大的难题就是数据库的问题,由于数库损坏,本来是决定拷贝一份舍友的,但是由于已经离校,数据库内容很大,加上现在正在实习,拷贝一份数据库花费的时间太长,于是就去请教了我们班的其他同学来帮忙,就是如何直接读取数据文件,同时也学到了不少的知识,也很感谢在最后的时间同学给予的帮助,希望大家都能顺利毕业,工作顺利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值