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


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

查看所有标签

猜你喜欢:

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

About Face 3

About Face 3

Alan Cooper、Robert Reimann、David Cronin / John Wiley & Sons / 2007-5-15 / GBP 28.99

* The return of the authoritative bestseller includes all new content relevant to the popularization of how About Face maintains its relevance to new Web technologies such as AJAX and mobile platforms......一起来看看 《About Face 3》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具