topN算法,spark实现

package com.kangaroo.studio.algorithms.topn;

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.broadcast.Broadcast;
import scala.Tuple2; import java.io.Serializable;
import java.util.*; public class TopNSpark implements Serializable { private JavaSparkContext jsc;
Broadcast<Integer> topNum;
private String inputPath; /*
* 构造函数
* 1. 初始化JavaSparkContext
* 2. 初始化广播变量topN个数, 可以被所有partition共享
* 3. 初始化输入路径
* */
public TopNSpark(Integer Num, String path) {
jsc = new JavaSparkContext();
topNum = jsc.broadcast(Num);
inputPath = path;
} /*
* 程序入口函数
* */
public void run() {
/*
* 读入inputPath中的数据
* */
JavaRDD<String> lines = jsc.textFile(inputPath, 1); /*
* 将rdd规约到9个分区
* */
JavaRDD<String> rdd = lines.coalesce(9); /*
* 将输入转化为kv格式
* key是规约的主键, value是排序参考的个数
* 注: 这里的key并不唯一, 即相同的key可能有多条记录, 所以下面我们规约key成唯一键
* 输入:line, 输出:kv
* */
JavaPairRDD<String, Integer> kv = rdd.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) throws Exception {
String[] tokens = s.split(",");
return new Tuple2<String, Integer>(tokens[0], Integer.parseInt(tokens[1]));
}
}); /*
* 规约主键成为唯一键
* 输入:kv, 输出:kv
* */
JavaPairRDD<String, Integer> uniqueKeys = kv.reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer i1, Integer i2) throws Exception {
return i1 + i2;
}
}); /*
* 计算各个分区的topN
* 这里通过广播变量拿到了topN具体个数, 每个分区都保留topN, 所有分区总个数: partitionNum * topN
* 输入:kv, 输出:SortMap, 长度topN
* */
JavaRDD<SortedMap<Integer, String>> partitions = uniqueKeys.mapPartitions(new FlatMapFunction<Iterator<Tuple2<String,Integer>>, SortedMap<Integer, String>>() {
public Iterable<SortedMap<Integer, String>> call(Iterator<Tuple2<String, Integer>> iter) throws Exception {
final int N = topNum.getValue();
SortedMap<Integer, String> topN = new TreeMap<Integer, String>();
while (iter.hasNext()) {
Tuple2<String, Integer> tuple = iter.next();
topN.put(tuple._2, tuple._1); if (topN.size() > N) {
topN.remove(topN.firstKey());
}
}
return Collections.singletonList(topN);
}
}); /*
* 规约所有分区的topN SortMap, 得到最终的SortMap, 长度topN
* reduce过后, 数据已经到了本地缓存, 这是最后结果
* 输入: SortMap, 长度topN, 当然有partitionNum个, 输出:SortMap, 长度topN
* */
SortedMap<Integer, String> finalTopN = partitions.reduce(new Function2<SortedMap<Integer, String>, SortedMap<Integer, String>, SortedMap<Integer, String>>() {
public SortedMap<Integer, String> call(SortedMap<Integer, String> m1, SortedMap<Integer, String> m2) throws Exception {
final int N = topNum.getValue();
SortedMap<Integer, String> topN = new TreeMap<Integer, String>();
for (Map.Entry<Integer, String> entry : m1.entrySet()) {
topN.put(entry.getKey(), entry.getValue());
if (topN.size() > N) {
topN.remove(topN.firstKey());
}
}
for (Map.Entry<Integer, String> entry : m2.entrySet()) {
topN.put(entry.getKey(), entry.getValue());
if (topN.size() > N) {
topN.remove(topN.firstKey());
}
}
return topN;
}
}); /*
* 将本地缓存的最终结果打印出来
* */
for (Map.Entry<Integer, String> entry : finalTopN.entrySet()) {
System.out.println(entry.getKey() + " -- " + entry.getValue());
}
} public static void main(String[] args) {
/*
* topN个数:topN
* 输入数据路径:inputPath
* */
Integer topN = Integer.parseInt(args[0]);
String inputPath = args[1];
TopNSpark topNSpark = new TopNSpark(topN, inputPath);
topNSpark.run();
}
}

大数据算法设计模式(1) - topN spark实现的更多相关文章

  1. 大数据算法设计模式(2) - 左外链接(leftOuterJoin) spark实现

    左外链接(leftOuterJoin) spark实现 package com.kangaroo.studio.algorithms.join; import org.apache.spark.api ...

  2. 大数据系列之并行计算引擎Spark介绍

    相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...

  3. 大数据平台搭建(hadoop+spark)

    大数据平台搭建(hadoop+spark) 一.基本信息 1. 服务器基本信息 主机名 ip地址 安装服务 spark-master 172.16.200.81 jdk.hadoop.spark.sc ...

  4. 大数据算法->推荐系统常用算法之基于内容的推荐系统算法

    港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...

  5. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  6. 大数据系列之并行计算引擎Spark部署及应用

    相关博文: 大数据系列之并行计算引擎Spark介绍 之前介绍过关于Spark的程序运行模式有三种: 1.Local模式: 2.standalone(独立模式) 3.Yarn/mesos模式 本文将介绍 ...

  7. CentOS6安装各种大数据软件 第十章:Spark集群安装和部署

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  8. 大数据学习(24)—— Spark入门

    在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益. 在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapRedu ...

  9. 大数据学习系列之六 ----- Hadoop+Spark环境搭建

    引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...

随机推荐

  1. Spring mybatis源码篇章-XMLLanguageDriver解析sql包装为SqlSource

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-MybatisDAO文件解析(二) 首先了解下sql mapper的动态sql语法 具体的动态sql的 ...

  2. 对#ifndef的理解

    由于对#ifndef的用法不太理解,在询问了老师#ifndef的含义以及查找资料后,对#ifndef总结了以下几点: <1> #ifndef是宏定义的一种,是三种预处理功能(宏定义,文件包 ...

  3. oop 第三次作业 文件读写

    oop第三次作业 GitHub 对于迟交我感到很抱歉 031602510 体会 这次的用到了之前的文件读写,传参 定义函数有返回值,使代码更加简洁.面向对象的程序设计,在面对函数多元的情况下,编程更加 ...

  4. 结队编程-基于gui的四则运算生成器

    成员:卢少锐 201421123027.刘存201421033023 coding.net地址 1.需求分析:除了实现四则运算的功能外,还添加了计时器功能和语言选择功能 2.程序设计:这次作业是基于上 ...

  5. 201521123056 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 1.1 思维导图: 2. 书面作业 本次作业题集集合 1. List中 ...

  6. 201521123028 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  7. 201521123061 《Java程序设计》第一周学习总结

    1.本周学习总结 (1) Java的来历与版本演进 最早是Sun公司绿色项目Green Project 中所撰写的Strar7应用程序的程序语言: (2)Java根据应用领域分为三大平台:Java S ...

  8. java:接口特性 接口与抽象类/普通类的区别

    接口 书面定义: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 在ja ...

  9. JS中基本的一些兼容问题 可能解释的不会太清楚

    做兼容注意: 一如果两个都是属性,用逻辑||做兼容 二如果有一个是方法 用三目运算符做兼容 三多个属性或方法封装函数做兼容 一:谷歌浏览器和火狐浏览器鼠标滚动条兼容 1.document.docume ...

  10. FastDFS安装全过程记录(V5.05)

    FastDFS安装全过程记录 1.安装准备 HA虚拟IP:192.168.1.208 HA软件:Keepalived 操作系统:CentOS 7 用户:root 数据目录:/data/fastdfs ...