文章目录
前言
提示:如有不对,请多多指教
我做的内容是哪个省份的销售额最多,由于我的电脑数据库坏了,打不开数据库,即使以管理员身份运行也不能打开,加上数据库比较大,而且目前也已经在上班了,时间不是很充裕,拷贝舍友的数据库也不太现实,所以我读取的技术是去问了其他同学,数据源是上学期数据可视化杨老师上课用的数据。
数据库损坏
尝试过以管理员身份运行但是还是不能够打开数据库
提示:以下是本篇文章正文内容,下面案例可供参考
一、导入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()
}
}