Spark_RDD之基本RDD操作
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操作的更多相关文章
- Spark学习(一)--RDD操作
标签(空格分隔): 学习笔记 Spark编程模型的两种抽象:RDD(Resilient Distributed Dataset)和两种共享变量(支持并行计算的广播变量和累加器). RDD RDD是一种 ...
- RDD操作
RDD操作 1.对一个数据为{1,2,3,3}的RDD进行基本的RDD转化操作 函数名 目的 示例 结果 map() 函数应用于RDD中的每个元素 rdd.map(x=>x+1) {2,3,4, ...
- Spark编程模型及RDD操作
转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...
- Spark 键值对RDD操作
键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...
- SPARKR,对RDD操作的介绍
(转载)SPARKR,对RDD操作的介绍 原以为,用sparkR不能做map操作, 搜了搜发现可以. lapply等同于map, 但是不能操作spark RDD. spark2.0以后, spar ...
- spark RDD操作的底层实现原理
RDD操作闭包外部变量原则 RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常.闭包函数传入到节点时,需要经过下面的步 ...
- Spark性能优化(2)——广播变量、本地缓存目录、RDD操作、数据倾斜
广播变量 背景 一般Task大小超过10K时(Spark官方建议是20K),需要考虑使用广播变量进行优化.大表小表Join,小表使用广播的方式,减少Join操作. 参考:Spark广播变量与累加器 L ...
- 【spark】RDD操作
RDD操作分为转换操作和行动操作. 对于RDD而言,每一次的转化操作都会产生不同的RDD,供一个操作使用. 我们每次转换得到的RDD是惰性求值的 也就是说,整个转换过程并不是会真正的去计算,而是只记录 ...
- 【Spark】RDD操作具体解释4——Action算子
本质上在Actions算子中通过SparkContext运行提交作业的runJob操作,触发了RDD DAG的运行. 依据Action算子的输出空间将Action算子进行分类:无输出. HDFS. S ...
随机推荐
- Zephyr的Logging
1 前言 刚接触Zephyr,两眼一抹黑,光是阅读代码对系统没什么概念.还需要通过一些日志了解系统的运行机制,以及各种内核行为. 这就需要借助系统的Logging,大体分为两部分System Logg ...
- SQL Server CTE 递归查询全解(转载)
在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询,本文详细介绍CTE递归调用的特性和使用示例 ...
- 2018 Multi-University Training Contest 1 部分简单题解析
Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...
- MemAdmin 轻量级可视化Memcached管理工具
蛮好用的 具体功能看图 开源地址:https://github.com/junstor/memadmin
- vsftpd虚拟账户配置
1. 概述 FTP是文件传输协议,在内外网的文件传输中使用广泛. 本篇博客主要介绍FTP服务器的部署和测试. 2. 软件环境部署 查看系统是否安装FTP软件(vsftpd),执行命令:rpm -qa ...
- Linux下针对服务器网卡流量和磁盘的监控脚本
1)实时监控网卡流量的通用脚本: [root@ceph-node1 ~]# cat /root/net_monit.sh #!/bin/bash PATH=/bin:/usr/bin:/sbin:/u ...
- Nginx+keepalived 双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- ELK实时日志分析平台环境部署--完整记录
在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...
- HDU 3537 Daizhenyang's Coin
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=3537] 题意 题意:已知一排硬币中有n个硬币正面朝上,输入正面朝上的硬币的位置ai.两人轮流操作, 每次 ...
- 【课程总结】Linux内核分析课程总结
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 每周实验报告: 反汇编一个简单的C程序 ...