弹性分布式数据集RDD(代码实现)
来源:互联网 发布:脸部黄金比例测试软件 编辑:程序博客网 时间:2024/06/08 03:11
统计用户对每个学科的各个模块访问的次数,取top3
RDD(textFile) -> RDD(map) -> RDD(reduceByKey) -> RDD(groupBy) -> RDD(sortBy).reverse.task
import java.net.URLimport org.apache.spark.rdd.RDDimport org.apache.spark.{SparkConf, SparkContext}/** *统计用户对每个学科的各个模块访问的次数,取top3 */object CountClass1 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("CountClass1").setMaster("local[2]") val sc = new SparkContext(conf) //获取数据 val file: RDD[String] = sc.textFile("C://Users/hositity/Desktop/access.txt") //切分数据,取出url生成元组 val urlAndOne: RDD[(String, Int)] = file.map(line => { val fields = line.split("\t") val url: String = fields(1) (url, 1) }) //相同的url聚合 val sumUrl: RDD[(String, Int)] = urlAndOne.reduceByKey(_+_) //获取学科信息 val project: RDD[(String, String, Int)] = sumUrl.map(x => { val url = x._1 val count = x._2 val project = new URL(url).getHost (project, url, count) }) //以学科信息分组,整合后得到结果 val result: RDD[(String, List[(String, String, Int)])] = project.groupBy(_._1).mapValues(_.toList.sortBy(_._3).reverse.take(2)) println(result.collect().toBuffer) sc.stop() }}
在IDEA上运行结果
*自定义一个分区器(继承Partitioner重写方法)
按照每个学科的数据放到不同的分区里
并调用saveAsTextFile***
package myRPC.qf.itcast.RDDimport java.net.URLimport org.apache.spark.rdd.RDDimport org.apache.spark.{HashPartitioner, Partitioner, SparkConf, SparkContext}import scala.collection.mutable/** * 自定义一个分区器 * 按照每个学科的数据放到不同的分区里 */object CountClass2 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("CountClass2").setMaster("local[2]") val sc = new SparkContext(conf) //获取数据 val file = sc.textFile("C://Users/hositity/Desktop/access.txt") //切分数据,取出url生成元组 val urlAndOne: RDD[(String, Int)] = file.map(line => { val fields = line.split("\t") val url = fields(1) (url, 1) }) //相同的url聚合 val sumedUrl: RDD[(String, Int)] = urlAndOne.reduceByKey(_+_) //获取学科信息并缓存 val cachedProject: RDD[(String, (String, Int))] = sumedUrl.map(x => { val url = x._1 val count = x._2 val project = new URL(url).getHost (project, (url, count)) }).cache() //调用Spark默认的分区器此时会发生哈希碰撞,x % 3 的hash值会分到同一块分区// val partition: RDD[(String, (String, Int))] = cachedProject.partitionBy(new HashPartitioner(3)) //得到所有学科 val projects: Array[String] = cachedProject.keys.distinct().collect() //调用自定义分区并获取分区号 val partitioner: ProjectPartitioner = new ProjectPartitioner(projects) //分区 val partitioned: RDD[(String, (String, Int))] = cachedProject.partitionBy(partitioner) //对每个分区的数据进行排序并取top3 val result: RDD[(String, (String, Int))] = partitioned.mapPartitions(it => { it.toList.sortBy(_._2._2).reverse.take(2).iterator }) result.saveAsTextFile("E://hadoop/log") sc.stop() }}//自定义分区器class ProjectPartitioner(projects: Array[String]) extends Partitioner{ //用来存储学科和分区号 private val projectsAndPartNum = new mutable.HashMap[String,Int]() //计数器,用于生成分区号 var n = 0 for(p <- projects){ projectsAndPartNum += (p -> n) n += 1 } //获取分区数 override def numPartitions = projects.length //获取分区号 override def getPartition(key: Any):Int ={ projectsAndPartNum.getOrElse(key.toString,0) }}
结果:
: 在各个分区的文件中的数据不会出现数据倾斜的情况
阅读全文
1 0
- 弹性分布式数据集RDD(代码实现)
- RDD,弹性分布式数据集
- 弹性分布式数据集RDD
- 弹性分布式数据集RDD
- Spark RDD:弹性分布式数据集
- Spark RDD:弹性分布式数据集
- 【Spark】弹性分布式数据集RDD概述
- RDD弹性分布式数据集(一)
- 弹性分布式数据集RDD概述
- 弹性分布式数据集RDD概述
- 弹性分布式数据集(RDD)
- Spark弹性分布式数据集RDD详解
- Spark RDD弹性分布式数据集
- Python--弹性分布式数据集(RDD)
- 弹性分布式数据集(RDD)
- 弹性分布式数据集RDD(概念)
- [Spark]Spark RDD 指南三 弹性分布式数据集(RDD)
- 【spark,RDD,1】弹性分布式数据集RDD介绍
- 15算法课程 122. Best Time to Buy and Sell Stock II
- MongoDb在线文档
- 求100以内全部的素数(作业)
- plsql循环
- 深度学习资料
- 弹性分布式数据集RDD(代码实现)
- 什么影响了MySQL的性能(01)
- linux shell 脚本判断某个文件是否有某个字符串以及统计含有某个字符串的个数然后做if else大于小于等于逻辑判断
- java中接口和抽象类的区别
- Vector和ArrayList的使用区别
- LeetCode 146 LRU Cache(list+unordered_map实现LRU缓存算法)
- Oracle 11g r2 使用Data dump 从CentOS 迁移到Window 10
- RocketMQ与Kafka对比(18项差异)
- markdown编辑器语法——文字颜色、大小、字体与背景色的设置(全)