测试版2410

统计出每一个省份每个广告被点击数量排行的 Top3

package Task

import org.apache.spark.{SparkConf, SparkContext}

object RDD_Req {
  def main(args: Array[String]): Unit = {
    val SparkConf = new SparkConf().setAppName("Req").setMaster("local[*]")
    val context = new SparkContext(SparkConf)
    // 读取文件
    val rdd = context.textFile("data/agent.log")

    // 转换和映射
    val mapRDD = rdd.map({
      line => {
        val datas = line.split(" ")
        ((datas(1), datas(4)), 1)
      }
    })
    //   聚合
    val reduceRDD = mapRDD.reduceByKey(_ + _)

    // 重新分组聚合
    val newMapRDD = reduceRDD.map {
      case ((sf, ad), sum) => (sf, (ad, sum))
    }
    val groupRDD = newMapRDD.groupByKey()

    // 排序
    val result = groupRDD.mapValues(
      iter => {
        iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(3)
      }
    )
    // 收集并打印结果
    result.collect().foreach(println)
  }
}

 使用自定义分区器按要求将数据分区

package Task
import org.apache.spark.{SparkConf, SparkContext}

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

    val inputFile = "/Users/hacker/Documents/Spark大数据处理技术/spark_core/data/data.txt" // 替换为你的文件路径
    val dataRDD = sc.textFile(inputFile)

    // 自定义分区函数,为每个元素添加一个分区键
    val partitionedData = dataRDD.map(line => {
      val partitionKey = line.headOption.map { c =>
        if (Character.isDigit(c)) 0
        else if (Character.isLowerCase(c)) 1
        else if (Character.isUpperCase(c)) 2
        else 3
      }.getOrElse(3) // 如果没有元素(空行),默认为3
      (partitionKey, line) // 返回一个(partitionKey, line)对
    })

    // 根据分区键重新分区数据(这里假设我们想要4个分区)
    val repartitionedData = partitionedData.repartition(4)

    // 你现在可以基于分区键处理数据
    // 例如,你可以将每个分区的数据写入不同的文件
    repartitionedData.mapPartitionsWithIndex((index, iter) => {
      val partitionData = iter.map(_._2) // 只需要行数据,不需要分区键
      // 这里只是打印分区索引和行数据,实际情况下你可以进行其他操作
      partitionData.foreach(line => println(s"Partition $index: $line"))
      iter // 返回迭代器,如果后续还有操作
    }).count() // 触发计算

    sc.stop()
  }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grey_hat_cmd

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值