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")
  }
}
相关推荐
计算机编程-吉哥5 小时前
大数据毕业设计-基于大数据的NBA美国职业篮球联赛数据分析可视化系统(高分计算机毕业设计选题·定制开发·真正大数据·机器学习毕业设计)
大数据·毕业设计·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计·大数据毕业设计选题推荐·大数据毕设项目
计算机编程-吉哥6 小时前
大数据毕业设计-基于大数据的BOSS直聘岗位招聘数据可视化分析系统(高分计算机毕业设计选题·定制开发·真正大数据·机器学习毕业设计)
大数据·毕业设计·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计·大数据毕业设计选题推荐·大数据毕设项目
RunningShare7 小时前
从“国庆景区人山人海”看大数据处理中的“数据倾斜”难题
大数据·flink
Hello.Reader8 小时前
Flink 执行模式在 STREAMING 与 BATCH 之间做出正确选择
大数据·flink·batch
文火冰糖的硅基工坊11 小时前
《投资-99》价值投资者的认知升级与交易规则重构 - 什么是周期性股票?有哪些周期性股票?不同周期性股票的周期多少?周期性股票的买入和卖出的特点?
大数据·人工智能·重构·架构·投资·投机
Elastic 中国社区官方博客11 小时前
Elasticsearch:使用推理端点及语义搜索演示
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
失散1312 小时前
分布式专题——33 一台新机器进行Web页面请求的历程
分布式·tcp/ip·http·路由器·交换机
数据智能老司机12 小时前
数据工程设计模式——冷热数据存储
大数据·设计模式·架构
Hello.Reader14 小时前
Flink 连接器与格式thin/uber 制品、打包策略与上线清单
大数据·flink
隐语SecretFlow15 小时前
【隐私计算科普】如何实现可证明安全?
大数据·开源·边缘计算