RDD的自定义分区器

一、先创一个order.csv文件

内容如下:

复制代码
1,99,备注1
222,92,备注2
1101,99,备注1
232,392,备注2
2110,99,备注1

二、建一个scala的object类,代码如下

Scala 复制代码
import org.apache.spark.{Partitioner, SparkConf, SparkContext}

// 创建一个类继承Partitioner
class OrderPartitioner extends Partitioner {

  override def numPartitions: Int = 2 // 两个分区,编号就是: 0, 1

  // key - value
  override def getPartition(key: Any): Int = {
// 如果key在2001和2003之间,就返回 0
// 否则,返回 1
val keyInt = key.asInstanceOf[Int]
    if (keyInt > 2000 && keyInt < 2003) {
      0
    } else {
      1
    }
  }
}

// case class
case class Order(id: Int, price: Double, category: String)

object PartitionOrder {
  def main(args: Array[String]): Unit = {
    // 创建SparkContext
    val conf = new SparkConf().setAppName("Partition").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 初始数据
    val rdd = sc.textFile("data/order.csv")

    val rdd1 = rdd.map(line => {
      val fields = line.split(",")
      (fields(0).toInt, Order(fields(0).toInt, fields(1).toDouble, fields(2)))
    })


    // 使用自定义分区器
    val rdd2 = rdd1.partitionBy(new OrderPartitioner)

    rdd2.map(x => x._2).saveAsTextFile("output18")

    val regionTotalAmount = rdd2.mapPartitions((iter) => {
      var count = 0
      var totalAmount = 0.0

      // 同时计算件数和总金额
      while (iter.hasNext) {
        val item = iter.next()
        count += 1
        val price = item._2.price
        println(price)
        totalAmount += price
      }

      Iterator(s"${count}件,$totalAmount")
    })

    // 在分区完成之后的基础上,只保留key
    //    val rdd3 = rdd2.map( x => x._2)

    regionTotalAmount.saveAsTextFile("output19")
  }
}
相关推荐
Data-Miner7 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
会议咨询9 小时前
2027年电力电子、人工智能与大数据国际会议(PEABD 2027)
大数据·人工智能·电力电子
GlobalInfo10 小时前
全球包装检测用3D轮廓传感器市场调研:2026年规模预计达1.87亿美元,食品医药与电商物流需求推动增长
大数据·人工智能·3d
程序 代码狂人10 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
starzy199011 小时前
Kafka响应发送:字节是怎么真正写回客户端的
大数据·kafka
数字新视界11 小时前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
KaiwuDB12 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
古法老登瞎折腾12 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
keyipatience12 小时前
Git学习(2)撤销与分支操作全指南
大数据·elasticsearch·搜索引擎
数字新视界12 小时前
模块化机房的设计与实施原理剖析
大数据·物联网·信息可视化·信息与通信·一体化机柜