Spark学习笔记之键值对操作-Java篇(三)

栏目: Java · 发布时间: 6年前

内容简介:Spark学习笔记之键值对操作-Java篇(三)

一:简介

键值对 RDD 是 Spark 中许多操作所需要的常见数据类型。本章就来介绍如何操作键值对 RDD。键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始 ETL(抽取、转 化、装载)操作来将数据转化为键值对形式。键值对 RDD 提供了一些新的操作接口(比如 统计每个产品的评论,将数据中键相同的分为一组,将两个不同的 RDD 进行分组合并等)。

二:创建Pair RDD 

在Spark中有很多种创建 pair RDD 的方式,此外,当需要把一个普通的RDD转为 pairRDD 时,可以调用 map() 函数来实现,传递的函数需要返回键值对

     public static JavaPairRDD createPairRDD() {
        List list = Arrays.asList(5, 4, 3, 2, 1, 6, 9, 5, 8, 9);
        SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("PairRDDDemo");
        sc = new JavaSparkContext(conf);
        sc.setLogLevel("ERROR");
        JavaRDD rdd = sc.parallelize(list);
        PairFunction keyData = new PairFunction() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2 call(Integer x) throws Exception {
                return new Tuple2(x, x + 1);// 键值对转换,key=x ,value=x+1
            }
        };
        JavaPairRDD pairs = rdd.mapToPair(keyData);
        System.out.println("转换后的键值对=" + pairs.collect());
        return pairs;
    }

三:Pair RDD 转化成操作

1:相同键的值进行相加  reduceByKey

JavaPairRDD pair = pairs.reduceByKey((v1, v2) -> v1 + v2);

2:相同键的值进行分组 groupByKey

  JavaPairRDD<Integer, Iterable> rdd = pairs.groupByKey();

3:获取所以得 keys

     JavaRDD keys = pairs.keys();

4:获取全部的 values

    JavaRDD values = pairs.values();

5:根据键排序 sortByKey

   JavaPairRDD sortByKey = pairs.sortByKey();

6:相同的键值当中取出最大的那个键值对 如:[(1,2), (2,3), (3,4),(3,8)] 结果就是[(1,2), (2,3),(3,8)] 

  JavaPairRDD max = pairs.reduceByKey((v1, v2) -> Math.max(v1, v2));

7:改变value的值 mapvalues

   JavaPairRDD mapValues = pairs.mapValues(v1 -> v1 + new Random().nextInt(10));

8:批量更改value的值 flatMapValues(和mapValues是有区别的)

    JavaPairRDD flatMapValues = pairs.flatMapValues(v1 -> Lists.newArrayList(10));

Spark学习笔记之键值对操作-Java篇(三)

四:Pair RDD 行动操作

1:对每个键对应的元素分别计数 countByKey

   Map countByKey = pairs.countByKey();

2:将结果以映射表的形式返回,以便查询 collectAsMap

    Map collectAsMap = pairs.collectAsMap();

3:返回给定键对应的所有值 lookup

     List lookup = pairs.lookup(9);

Spark学习笔记之键值对操作-Java篇(三)

五:RDD分区

1. 什么是分区

RDD 内部的数据集合在逻辑上(以及物理上)被划分成多个小集合,这样的每一个小集合被称为分区。RDDprdd作为一个分布式的数据集,是分布在多个worker节点上的。如下图所示,RDD1有五个分区(partition),他们分布在了四个worker nodes 上面,RDD2有三个分区,分布在了三个worker nodes上面。

Spark学习笔记之键值对操作-Java篇(三)

2. 为什么要分区

分区的个数决定了并行计算的粒度。多个分区并行计算,能够充分利用计算资源。

3. 如何手动分区

java的分区可以这样(parallelize)

JavaRDD rdd = sc.parallelize(list, 2); // 这个是分区用了,指定创建得到的 RDD 分区个数为 2。

pairs.partitions().size() 分区数量查看

源码demo 

https://github.com/zhp8341/sparkdemo/blob/master/src/main/java/com/demo/spark/rdddemo/PairRDDDemo.java


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法神探

算法神探

[美] 杰瑞米·库比卡 / 啊哈磊、李嘉浩 / 电子工业出版社 / 2017-2 / 65

《算法神探:一部谷歌首席工程师写的CS小说》围绕程序设计典型算法,精心编织了一个扣人心弦又趣味横生的侦探缉凶故事。小说主人公运用高超的搜索技巧和精深的算法知识,最终识破阴谋、缉拿元凶。其间,用二分搜索搜查走私船、用搜索树跟踪间谍、用深度优先搜索逃离监狱、用优先队列开锁及用最佳优先搜索追寻线索等跌宕起伏又富含算法精要的情节,让读者在愉悦的沉浸式体验中快速提升境界,加深对程序世界的理解。《算法神探:一......一起来看看 《算法神探》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具