1.基本转化操作

   1.1最常用的两个转化操作时map()和filter()。

  map()接收一个函数,把这个函数用于RDD中的每个元素,将函数作用之后的结果作为结果RDD中元素的值。

  filter()接收一个函数,将RDD中满足该函数的元素返回放入新的RDD中。

  举一个使用map()求RDD平方的例子。scala代码如下:

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf();
    conf.setAppName("map");
    conf.setMaster("local");
    val sc = new SparkContext(conf);
    val num = sc.parallelize(List(, , , ));
    val result = num.map(x => x*x);
    result.take().foreach(println);
  }

对应的Java代码为:

public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        conf.setAppName("trans");
        conf.setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(, , , ));
        JavaRDD<Integer> outputRdd = rdd.map(new Function<Integer,Integer >() {
            private static final long serialVersionUID = 1L;
            public Integer call(Integer x) throws Exception {
                return x*x;
            }
        });

        System.out.println(StringUtils.join(",", outputRdd.collect()));
        sc.close();
    }

  1.2 flatMap()

  有时候我们希望操作一个元素使他返回多个元素,这时我们可以使用flatMap()。下面举一个例子,将一个包含一个字符串的RDD通过空格切分,返回多个元素。

  scala代码如下:

   def main(args: Array[String]): Unit = {
        val conf = new SparkConf();
        conf.setAppName("flatmap");
        conf.setMaster("local");
        val sc = new SparkContext(conf);
        val lines = sc.parallelize(List("hello world","hi"));
        val words = lines.flatMap(line => line.split(" "))
        println(words.first())
   }

 1.3集合操作

  1.union(),返回一个包含两个RDD所以元素的RDD。例:

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf();
    conf.setAppName("union");
    conf.setMaster("local");
    val sc = new SparkContext(conf);

    val a = sc.parallelize(List(, , ));
    val b = sc.parallelize(List(, , ));

    val c = a.union(b);
    println(c.collect().mkString(","));
  }

Java代码如下:

    public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        conf.setAppName("trans");
        conf.setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<Integer> a = sc.parallelize(Arrays.asList(1, 2, 3));
        JavaRDD<Integer> b = sc.parallelize(Arrays.asList(3, 4, 5));
        JavaRDD<Integer> c = a.union(b);

        System.out.println(StringUtils.join(",", c.collect()));
        sc.close();
    }

如果想要去除重复的元素,可以使用distinct()方法,不过该方法开销很大,因为它需要将所有数据通过网络进行混洗shuffle。

使用intersection(other)方法可以返回两个RDD中都有的元素,它会去除RDD中重复的元素。同样它也需要进行混洗,开销大,效率低。

使用Cartesian(other)计算两个RDD的笛卡尔积。

使用subtract(other),从一个RDD中移除在另一个RDD含有的元素 。

1.4行动操作

  1.reduce():reduce函数接收一个函数,这个函数操作两个RDD并返回一个同样类型的新元素。举个简单的+的例子。

object ReduceRdd {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf();
    conf.setAppName("reduce");
    conf.setMaster("local");
    val sc = new SparkContext(conf);

    val rdd = sc.parallelize(List(1, 2, 3, 4));
    val sum = rdd.reduce((x,y) =>x+y);
    println(sum);
  }
}

  2.aggregate():我们可以使用这个函数返回不同类型的新元素。使用这个函数时,首先要提供我们期待返回类型的初始值,然后使用一个函数将RDD的元素进行累加,最后使用一个函数将不同节点上的RDD进行合并。举一个求平均数的例子:

object BasicAvg {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf();
    conf.setAppName("reduce");
    conf.setMaster("local");
    val sc = new SparkContext(conf);

    val num = sc.parallelize(List(1,2,3,4));
    val result = num.aggregate((0,0))((x,y) => (x._1+y,x._2+1), (x,y)=>(x._1+y._1,x._2+y._2));

    val avg = result._1/result._2.toDouble;
    println(avg);
  }
}

  解释一下aggregate()的过程,首先给定我们期待的结果的RDD的初始值,为 (0,0),第一个值表示的是RDD各个元素的值,第二个值表示的是元素的个数。第一个函数进行的是累加操作,比如第一个RDD累加后的值为(1,1),第二个RDD累加后的值为(3,2),以此类推。第二个函数主要是为了将不同节点上的RDD进行合并。

  3.还有一些简单的将数据返回给驱动程序的操作,比如

  collect(),它会将整个RDD的内容返回。

  take(n)返回RDD的n个元素。

  foreach()行动操作对RDD中的每一个元素进行操作。

  count()计算RDD中元素的个数。

  countByValue()计算各个元素在RDD中出现的次数。

Spark_RDD之基本RDD操作的更多相关文章

  1. Spark学习(一)--RDD操作

    标签(空格分隔): 学习笔记 Spark编程模型的两种抽象:RDD(Resilient Distributed Dataset)和两种共享变量(支持并行计算的广播变量和累加器). RDD RDD是一种 ...

  2. RDD操作

    RDD操作 1.对一个数据为{1,2,3,3}的RDD进行基本的RDD转化操作 函数名 目的 示例 结果 map() 函数应用于RDD中的每个元素 rdd.map(x=>x+1) {2,3,4, ...

  3. Spark编程模型及RDD操作

    转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...

  4. Spark 键值对RDD操作

    键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...

  5. SPARKR,对RDD操作的介绍

    (转载)SPARKR,对RDD操作的介绍   原以为,用sparkR不能做map操作, 搜了搜发现可以. lapply等同于map, 但是不能操作spark RDD. spark2.0以后, spar ...

  6. spark RDD操作的底层实现原理

    RDD操作闭包外部变量原则 RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常.闭包函数传入到节点时,需要经过下面的步 ...

  7. Spark性能优化(2)——广播变量、本地缓存目录、RDD操作、数据倾斜

    广播变量 背景 一般Task大小超过10K时(Spark官方建议是20K),需要考虑使用广播变量进行优化.大表小表Join,小表使用广播的方式,减少Join操作. 参考:Spark广播变量与累加器 L ...

  8. 【spark】RDD操作

    RDD操作分为转换操作和行动操作. 对于RDD而言,每一次的转化操作都会产生不同的RDD,供一个操作使用. 我们每次转换得到的RDD是惰性求值的 也就是说,整个转换过程并不是会真正的去计算,而是只记录 ...

  9. 【Spark】RDD操作具体解释4——Action算子

    本质上在Actions算子中通过SparkContext运行提交作业的runJob操作,触发了RDD DAG的运行. 依据Action算子的输出空间将Action算子进行分类:无输出. HDFS. S ...

随机推荐

  1. MySQL 基础十一 事件

    1.查看事件 2.创建事件 3.执行事件,并查看执行结果是否正确 一 查看事件 -- 1.查看所有事件(显示执行频率(按年.月.日).创建日期.最后执行事件等)SELECT * FROM mysql. ...

  2. 使用HashSet<>去除重复元素的集合

    比如,某一个阵列中,有重复的元素,我们想去除重复的,保留一个.HashSet<T>含不重复项的无序列表,从MSDN网上了解到,这集合基于散列值,插入元素的操作非常快. 你可以写一个方法: ...

  3. (转)Ubuntu无法找到add-apt-repository问题的解决方法

    原文 网上查了一下资料,原来是需要 python-software-properties 于是 apt-get install python-software-properties 除此之外还要安装 ...

  4. asp.net web api集成微信服务(使用Senparc微信SDK)- z

    /// <summary> /// 微信请求转发控制器 /// </summary> [RoutePrefix("weixin")] public clas ...

  5. [Oracle]PDB Clone 方法

    Source: SQL> alter pluggable databse pdb1 open; Target: SQL> alter session set container=cdb$r ...

  6. 事务,acid,cap,paxos随笔

    事务ACID四个特性: A:原子性(Atomicity)C:一致性(Consistency)I:隔离性(Isolation)D:持久性(Durability) 原子性:语句要么全执行,要么全不执行,是 ...

  7. Socket异步通信及心跳包同时响应逻辑分析(最后附Demo)。

    有段时间没有更博了,刚好最近在做Socket通信的项目,原理大致内容:[二维码-(加logo)]-->提供主机地址和端口号信息(直接使用[ThoughtWorks.QRCode.dll]比较简单 ...

  8. VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录

    几种主要的虚拟化 ESXi是VMware公司研发的虚拟机服务器,ESXi已经实现了与Virtual Appliance Marketplace的直接整合,使用户能够即刻下载并运行虚拟设备.这为 即插即 ...

  9. mac下查看和设置环境变量

    1.查看环境变量 命令    env 2.修改环境变量 命令    cd ~ && ls -a && sudo vim .bashrc 编辑输入要添加的环境变量 3.s ...

  10. 安装Visual Studio2013

    安装Visual Studio2013现在官网下载在选择安装的可选功能这里,大家可以根据自己需要勾选,也可以默认全选.这里有个小功能,把鼠标放在文字上,会弹出各个功能的详细描述.选择四个常用的功能,另 ...