《数据算法Hadoop/Spark》读书笔记3--Top10

数据算法--Hadoop/Spark大数据处理技巧 data algorithms部分主题自写scala程序实现 SecondarySort (chapter 1) data 2015,1,1,10 2015,1,2,11 2015,1,3,12 2015,1,4,13 2015,2,1,22 2015,2,2,23 2015,2,3,24 2015,2,4,25 2015,3,1,20 2015,3,2,21 2015,3,3,22 2015... 阅读详情

若返回要求为JavaPairRDD<K,V>,Tuple2<K,V>即可

1 说明

本实验测试spark实现top10。

思路:先对数据进行mapPartitions对每个区取top10得到partition,然后对上述partition(即每个区的top10)取得的结果进行top10汇总。

当数据存放在一个分区时,本地partirion和最终汇总效果一直;
当有多分区时,每个分区都会取各自的top10。

本章使用的mapPartitions()见上一篇博客。

本章知识

方法描述
foreach()对RDD使用,每个RDD都执行
对分区使用,则每个分区都执行
collect()对n分区使用,则生成长度为n的List
每个元素为整个分区
如:
List<TreeMap<Integer, String>> allTop10 =
partitions.collect();
reducestatic T reduce(Function2<T,T,T> f)

参数中的前两个T都是输入(满足交换律结合律),第三个T是输出

1 唯一key单分区和多分区测试

输入数据
21行,测试单分区top10和2分区top10

chap02-top10.txt

cat1,12
cat2,13
cat3,14
cat4,15
cat5,10
cat100,100
cat200,200
cat300,300
cat1001,1001
cat67,67
cat22,22
cat23,23
cat1000,1000
cat2000,2000
cat400,400
cat500,500
c1,1
c2,2
c3,3
c4,4
c5,555

核心流程

Created with Raphaël 2.1.2 <String><,><Integer>转键值对pairs,即lines->JavaRDD ① mapPatitions (new FlatMapFunction<Iterator, Map> ) ② 验证每个分区后的结果 ③ 对分区collect()或④reduce()汇总最终top10

/ 1 / 说明
上述标号中的
① 核心代码:

pairs.mapPartitions(
     new FlatMapFunction<
         Iterator<Tuple2<String,Integer>>,//对分区操作,输入为可迭代 
         TreeMap<Integer, String> //输出
         >() {
     ...
}

② 对1分区和2分区测试
1分区:

JavaRDD<String> lines = sc.textFile("chap02-top10.txt");

2分区:

JavaRDD<String> lines = sc.textFile("chap02-top10.txt",2);

/ 1 / 代码

package cn.whbing.spark.dataalgorithms.chap02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.spark.SparkConf;
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.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import com.google.common.collect.Lists;

import cn.whbing.spark.dataalgorithms.chap01.util.TupleComparator;
import scala.Tuple2;

/**
* 
* @author whbing
*/

public class Top10 {

public static void main(String[] args) {

    SparkConf conf = new SparkConf().setAppName("SecondarySort by spark").setMaster("local");
    JavaSparkContext sc = new JavaSparkContext(conf);

    //读取每一行即<cat_id><,><weight>
    JavaRDD<String> lines = sc.textFile("chap02-top10.txt",2); //***

    //转化成键值对形式-->  <catId,weight>
    JavaPairRDD<String, Integer> pairs = 
            lines.mapToPair(new PairFunction<String,String,Integer>() {

                @Override
                public Tuple2<String, Integer> call(String s) throws Exception {
                    //对输入s进行转换
                    String[] tokens = s.split(",");//s即cat1,2 以逗号分割
                    String catId = tokens[0];
                    Integer weight = new Integer(tokens[1]);
                    return new Tuple2<String,Integer>(catId,weight);
                }
            }); 

    /*
     * 思路:将RDD以weight为key放入TreeMap中(默认升序),只留后10个即可
     */
    // STEP-5: create a local top-10
       JavaRDD<TreeMap<Integer, String>> partitions = pairs.mapPartitions(
         new FlatMapFunction<Iterator<Tuple2<String,Integer>>, TreeMap<Integer, String>>() {
         @Override
         public Iterator<TreeMap<Integer, String>> call(Iterator<Tuple2<String,Integer>> iter) {
             TreeMap<Integer, String> top10 = new TreeMap<Integer, String>();
             while (iter.hasNext()) {
                Tuple2<String,Integer> tuple = iter.next();
                top10.put(tuple._2, tuple._1);
                // keep only top N 
                if (top10.size() > 10) {
                   top10.remove(top10.firstKey());
                }  
             }
             //以下两种均可,map转iterator
             //return Collections.singletonList(top10).iterator();
             return Lists.newArrayList(top10).iterator();
         }
       });

    //验证本地top10
       //当有多个分区时(本测试为2,见input后参数),每个partition都会执行以下操作
       System.out.println("验证本地top10 partitions:");
    partitions.foreach(new VoidFunction<TreeMap<Integer,String>>() {

        @Override
        public void call(TreeMap<Integer, String> m) throws Exception {
            for(Map.Entry<Integer, String> entry: m.entrySet()){
                System.out.println(entry.getKey()+":"+entry.getValue());
            }               
        }
    });
}
}

/ 2 / 结果:

1分区时结果:

INFO SparkContext: Starting job: foreach at Top10.java:82
验证本地top10 partitions:

67:cat67
100:cat100
200:cat200
300:cat300
400:cat400
500:cat500
555:c5
1000:cat1000
1001:cat1001
2000:cat2000

结果表明:1分区时就是最终结果


2分区时结果:

INFO SparkContext: Created broadcast 0 from textFile at Top10.java:39
验证本地top10 partitions:

10:cat5
12:cat1
13:cat2
14:cat3
15:cat4
67:cat67
100:cat100
200:cat200
300:cat300
1001:cat1001

2:c2
3:c3
4:c4
22:cat22
23:cat23
400:cat400
500:cat500
555:c5
1000:cat1000
2000:cat2000

结果表明:每个分区都有对自己区top10的结果。


2 分区汇总 :最终top10

迭代处理每个分区的top10结果,创建最终的top10

2.1 汇总方案1:collect到集合

//汇总方案1:collect到集合
/**
 *   partition1      partition2
 *       |               |  
 *            collect()
 *               |
 *      List<partition1或2的类型>
 *   说明:partition1或2类型一致,List的长度为分区个数,2分区即为2      
 */
//用于保存最终top10
TreeMap<Integer,String> finalTop10 = new TreeMap<Integer,String>();

List<TreeMap<Integer, String>> allTop10 = partitions.collect();

for(TreeMap<Integer,String> treeMap : allTop10){  //List
    //每次循环的treeMap为每个分区的treeMap
    //对每个分区的treeMap遍历
    for(Map.Entry<Integer, String> entry : treeMap.entrySet()){
        finalTop10.put(entry.getKey(), entry.getValue());
            //只保留前10
        if(finalTop10.size()>10){
            finalTop10.remove(finalTop10.firstKey());//默认从小到大排序
        }
    }

}
//验证finalTop10,打印finalTop10集合即可
System.out.println("====汇总方案1,集合方法,finalTop10结果:====");
for(Integer key:finalTop10.keySet()){
    System.out.println(key+" -> "+finalTop10.get(key));
}

结果:

====汇总方案1,collect到集合方法,finalTop10结果:====
67 -> cat67
100 -> cat100
200 -> cat200
300 -> cat300
400 -> cat400
500 -> cat500
555 -> c5
1000 -> cat1000
1001 -> cat1001
2000 -> cat2000

2.1 汇总方案2:reduce到集合

//汇总方案2:reduce到集合
//用于保存最终top10
TreeMap<Integer,String> finalTop10_2 = new TreeMap<Integer,String>();
partitions.reduce(new Function2<
        TreeMap<Integer,String>, 
        TreeMap<Integer,String>, 
        TreeMap<Integer,String>>() {

    @Override
    public TreeMap<Integer, String> call(TreeMap<Integer, String> m1, TreeMap<Integer, String> m2) throws Exception {
        //m1,partitionK-1
        for(Map.Entry<Integer, String> entry:m1.entrySet()){
            finalTop10_2.put(entry.getKey(), entry.getValue());
            if(finalTop10_2.size()>10){
                finalTop10_2.remove(finalTop10_2.firstKey());
            }
        }
        //m2,partitionK
        for(Map.Entry<Integer, String> entry:m2.entrySet()){
            finalTop10_2.put(entry.getKey(), entry.getValue());
            if(finalTop10_2.size()>10){
                finalTop10_2.remove(finalTop10_2.firstKey());
            }
        }
        return finalTop10_2;
    }
});
//方案2验证finalTop10,打印finalTop10_2集合即可
System.out.println("====汇总方案2,reduce到集合方法,finalTop10_2结果:====");
for(Integer key:finalTop10_2.keySet()){
    System.out.println(key+" -> "+finalTop10_2.get(key));
}

结果

====汇总方案2,reduce到集合方法,finalTop10_2结果:====
67 -> cat67
100 -> cat100
200 -> cat200
300 -> cat300
400 -> cat400
500 -> cat500
555 -> c5
1000 -> cat1000
1001 -> cat1001
2000 -> cat2000
《数据算法-Hadoop/Spark大数据处理技巧》读书笔记(五)——购物篮分析 这个购物篮分析要先理解他在算什么,我的理解是通过购物小票上的购物信息,在指定规则下穷举全部的购物关联性。 1.模型解释 ①数据源 a、b、c、d分别代表一种商品,超市的购物小票数据如下(为了简单起见,取4条小票数据),每个小票中的商品必须按照一定的顺序进行排列,否则会出现重复计算的情况: a,b,c a,b,d b,c b,c ②定义模式长度为3,即最多只考虑3种商品的购买管理关系... 阅读详情

相关推荐

hadoop 单词筛选 top-k问题

最近开始学习hadoop,(hadoop 以下简称hd),在完成了hd的环境搭建之后,就开始试着跑那些原始例子,比如其中的wordcount,统计文章中各单词的出现频率。由于本人还在念书,在我们这学期开设的软件工程课上,老师布置了一道题。如下:     请实现程序:筛选出文章中出现频率最高的10个词语。文件大小30k--300k.     一看这题,我立马想到了hd去实现,这300k的数据简直

dengjiexian123的专栏 1万+

Python与大数据:Hadoop、Spark和Pyspark的应用和数据处理技巧

通过Python强大的数据处理库和易用的编程语法,我们可以处理和分析大规模数据集,从中获得有价值的信息和见解。掌握一些数据处理技巧,如数据清洗、特征工程、数据聚合与汇总、并行处理和数据可视化,可以提高大数据处理的效率和准确性。通过不断学习和实践,读者可以不断探索和应用Python在大数据领域的新技术和工具,进一步提升数据处理和分析的能力。在本文中,我们将探讨Python在大数据领域的应用,重点介绍Hadoop、Spark和Pyspark,并分享一些数据处理的技巧。# 将结果写入Parquet文件。

baidu_38876334的博客 3237

数据算法 Hadoop Spark大数据处理技巧

百度云下载链接

大数据处理基础:SparkvsHadoop

1.背景介绍 1. 背景介绍 大数据处理是现代计算机科学中的一个重要领域,涉及到处理和分析海量数据。随着数据的增长和复杂性,传统的数据处理方法已经无法满足需求。因此,大数据处理技术诞生,为处理海量数据提供了高效的方法。 在大数据处理领域,Spark和Hadoop是两个非常重要的技术。Spark是一个快速、高效的大数据处理框架,可以处理批量数据和流式数据。Hadoop是一个分布式文件系统和大数...

AI天才研究院 1563

数据算法 Hadoop Spark大数据处理技巧 中文PDF

《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和Spark。

数据算法Hadoop/Spark大数据处理技巧 源代码

数据算法Hadoop/Spark大数据处理技巧 源代码 内有部分数据集

大数据之——MapReduce代码详解(包括无敌避坑wordcount项目)

其实这一篇我有简单提到这个MapReduse的概念,但是只是粗略的讲解,可以去大致看一眼MapReduse跟HDFS、YARN的关系:(另外注意,这一篇文章需要有一定java基础,本文大量用到java,不再过多解释java原理)

m0_73991249的博客 7091

数据算法:Hadoop/Spark大数据处理技巧

数据算法:Hadoop/Spark大数据处理技巧

《数据算法-Hadoop/Spark大数据处理技巧》读书笔记(二)——TopN列表

大数据计算力经常要面对TopN的问题,也就是一个大集合里取排序后的前N个数据。 1.Key值唯一 ①MapReduce: 在Map中使用SortedMap完成每个节点的TopN操作,然后所有节点将数据汇聚到Reduce节点,再次使用SortedMap完成TopN操作,其中setup()中做初始化工作,map()中构造SortedMap,在cleanup()中将生成的SortedMap输出给r

狂暴棕熊的博客 648

FoundationPose复现及Realsense应用

FoundationPose是一个统一的基础模型,用于6D对象姿态估计和跟踪,支持基于模型和无模型的设置。在测试时可以立即应用于未见过的新对象,无需微调,只要给出其CAD模型,或者捕获少量RGBD参考图像。得益于统一框架,下游姿态估计模块在两种3D模型设置中都是相同的,当没有CAD模型时,使用神经隐式表示进行高效的新视角合成。通过大规模合成训练,辅以大型语言模型(LLM)、一种基于transformer的新架构和对比学习公式,实现了强大的泛化能力。

m0_56661101的博客 1万+

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2123

《数据算法Hadoop/Spark》读书笔记4--topN

本章待完善。 有问题待解答。 broadcast()共享全局变量,实验证明,无论是本地还是集群模式,全局变量也是可以的,为什么还要广播呢? broadcast() 本测试提交脚本 cd $SPARK_HOME #top10 ./bin/spark-submit --class cn.whbing.spark.dataalgorithms.chap02.Top...

王小禾 274

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

数据算法第三章中的问题你面试和工作中遇到过吗?

昨天我写了一篇文章《年轻人你渴望力量吗 | 我读过的一些书推荐》,其中推荐了一本书《数据算法》,这是其中的一个章节,恰巧前几天我在和一个读者交流的过程中,这个题目在他面试字节跳动的时候有...

微信搜:import_bigdata,大数据领域硬核原创作者 369

Ubuntu22.04下ROS2与PX4仿真环境搭建全流程解析

本文详细解析了在Ubuntu22.04系统下搭建ROS2与PX4仿真环境的全流程,包括系统准备、ROS2 Humble安装、PX4飞控环境部署、ROS2与PX4通信桥梁搭建等关键步骤。针对常见问题提供了解决方案,并分享了性能优化和开发调试技巧,帮助开发者快速构建无人机仿真开发环境。

weixin_29248653的博客 607

FPGA之道(22)VHDL基本程序框架

在介绍详细的VHDL语法之前,让我们先来了解一下VHDL代码的基本程序框架,这样可以让我们先对VHDL程序设计有一个整体的概念把握,进而在后续的VHDL语法学习中做到有的放矢。

Reborn Lee 8307

《数据算法-Hadoop/Spark大数据处理技巧》读书笔记(一)——二次排序

写在前面: 在做直播的时候有同学问Spark不是用Scala语言作为开发语言么,的确是的,从网上查资料的话也会看到大把大把的用Scala编写的Spark程序,但是仔细看就会发现这些用Scala写的文章绝大部分是初级内容,最常见的就是某一个API是怎么用的,很多都是拷贝粘贴的重复内容,真正深入的内容并不多见。之前看美团团队写的Spark优化相关放出的代码是用Java写的,《数据算法-Hadoop/

狂暴棕熊的博客 2596

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4563

《数据算法-Hadoop/Spark大数据处理技巧》读书笔记(四)——移动平均

移动平均:对时序序列按周期取其值的平均值,这种运算被称为移动平均。典型例子是求股票的n天内的平均值。 移动平均的关键是如何求这个平均值,可以使用Queue来实现。 public class MovingAverageDriver { public static void main(String[] args){ SparkConf conf = new SparkC

狂暴棕熊的博客 1832

高频注入是否需要对齐和强拖操作?

高频注入技术显著优化了传统FOC启动流程,但仍需部分对齐操作。传统启动必须包含位置检测、对齐和强拖等步骤,而高频注入可实现零速闭环,简化或跳过部分环节。高频注入下的对齐主要用于验证有效性、初始化观测器和建立初始磁链,形式可大幅简化。虽然高频注入基本消除了传统强拖需求,但在重载、弱凸极等特殊情况下仍需辅助。实际应用中可采用自适应混合策略,根据负载和电机类型选择最优启动方案。高频注入使对齐和强拖从"必须"变为"可选优化项",是无传感器控制的重要进步。

汽车软件开发 204

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

【人工智能数据科学与数据处理】——深入详解数据库与大数据技术之大数据处理框架:Hadoop与Spark

深入详解人工智能数据科学与数据处理中数据库与大数据技术——大数据处理框架:Hadoop与Spark

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2005

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

O&#39;Reilly精品图书推荐:数据算法:Hadoop/Spark大数据处理技巧

本书介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这本书还概要介绍了MapReduce、Hadoop和Spark。

OReillyData 789

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大数据算法_30年开发经验大牛分享:数据算法,Hadoop/Spark大数据处理技巧pdf

前言随着大规模搜索引擎(如Google和Yahoo!) 、基因组分析(DNA测序、RNA测序和生物标志物分析)以及社交网络(如Facebook和Twitter)的不断发展,需要生成和处理的数据量已经超过了千万亿字节。为了满足如此庞大的计算需求,我们需要高效、可伸缩的并行算法。MapReduce范式就是解决这些问题的一个 框架。MapReduce是一个软件框架, 可以采用并行、分布式方式处理GB、T...

weixin_39962889的博客 289

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《数据算法Hadoop/Spark》读书笔记1--二次排序

1 说明 本章知识 1.1 Chapter 01: Secondary Sorting With Spark 1.1.1 新建maven工程 1.1.2 编辑输入文件 1.1.3 二次排序 1.1.4 运行结果 1.1.5 小结 1 说明 本文档介绍Spark的二次排序解决方案。 本章知识 方法 返回类型/描述 textFile ...

王小禾 645
上一篇: 《数据算法Hadoop/Spark》读书笔记2--map与flatMap、mapPartitions对比
下一篇: 《数据算法Hadoop/Spark》读书笔记4--topN
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值