---------------------

本节内容:

· Spark转换 RDD操作实例

· Spark行动 RDD操作实例

· 参考资料

---------------------

关于学习编程方式的,每个人都有自己的方式。对我个人来说,最好的方法还是多动手写demo,要多写代码,才能理解的更加深刻,本节以例子的形式讲解各个Spark RDD的使用方法和注意事项,本文一共讲解了20个RDD的使用demo。

一、Spark转换 RDD操作实例

RDD转换操作返回的是RDD,而行动操作返回的是其他数据类型。

1.例子:textFile/collect/foreach

---------------------

val line =sc.textFile("/tmp/test/core-site.xml");

line.collect().foreach(println);

------

说明:

textFile:读取hdfs数据

collect:收集RDD数据集

foreach:循环遍历打印出来

---------------------

val line =sc.parallelize(List(1,2,3,4));

line.map(x=>x*x);

line.collect().mkString(",").foreach(print);

------

说明:

parallelize:从外部数据集创建RDD

map:接收一个函数,把这个函数作用于RDD中的每一个元素,输入类型和返回类型不需要相同。

mkString:增加分隔符

---------------------

2.例子:flatMap/first

---------------------

val lines =sc.parallelize(List("hello world","hi hi hhe"));

val words=lines.flatMap(line => line.split(" "));

words.collect().foreach(println);

words.first();

------

说明:

flatMap:flatMap将返回的迭代器拍扁,将迭代器中的多个RDD中的元素取出来组成一个RDD.

first:收集RDD数据集中的第一个数据

---------------------

3.例子:filter/union

---------------------

val lines =sc.textFile("/tmp/test/core-site.xml");

val name=lines.filter(line =>line.contains("name"));

val value=lines.filter(line =>line.contains("value"));

val result=name.union(value);

result.collect().foreach(println);

------

说明:

filter:不会改变RDD中的内容,将满足filter条件的元素返回,形成新的RDD.

union:将两个RDD的内容合并成一个RDD,操作的是两个RDD.需要两个RDD中的元素类型是相同的.

---------------------

4.例子:distinct/sample/intersection/subtract/cartesian

---------------------

val lines =sc.parallelize(List(1,2,3,4,1,2,3,3));

val result = lines.distinct();

result.collect().foreach(println);

val a = sc.parallelize(1 .to(1000),3);

val result = a.sample(false,0.02,0);

result.collect().foreach(println);

val a=sc.parallelize(List(1,2,3,4));

val b=sc.parallelize(List(1,2));

val result=a.intersection(b);

val result2=a.subtract(b);

result.collect().foreach(println);

result2.collect().foreach(println);

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

val b=sc.parallelize(List("1","2"));

val result=a.cartesian(b);

result.collect().foreach(println);

------

说明:

distinct:对RDD中元素去重,会触达shuffle操作,低效

sample:对RDD中的集合内元素进行采样,第一个参数withReplacement是true表示有放回取样,false表示无放回。第二个参数表示比例(取出元素个数占比),第三个参数是随机种子。

intersection:求两个RDD共同的元素的RDD,回去重,引发shuffle操作.

subtract:移除RDD中的内容,会引发shuffle操作.

cartesian:求笛卡尔积,大规模数据时开销巨大.

---------------------

二、Spark行动 RDD操作实例

1.例子:reduce/fold/aggregate[action操作]

--------reduce-------------

val line =sc.parallelize(List(1,2,3,4));

val sum = line.reduce((x,y) =>x+y);

println(sum);

--------fold-------------

val line =sc.parallelize(List(1,2,3,4),2);

val sum = line.fold(1)((x,y) =>x+y);

println(sum);

--------aggregate demo01-------------

val line =sc.parallelize(List(1,2,3,4));

val result= line.aggregate((0,0))(

(acc,value)=>(acc._1+value,acc._2+1),

(acc1,acc2) =>(acc1._1+acc2._1,acc1._2+acc2._2)

);

val avg=result._1/result._2.toDouble;

println(avg);

--------aggregate demo02-------------

def seqOP(a:Int,b:Int):Int={

println("seqOp:"+a+"\t"+b)

math.min(a,b)

}

def comOp(a:Int,b:Int):Int={

println("comOp:"+a+"\t"+b)

a+b

}

val line=sc.parallelize(List(1,2,3,4,5),1);

val result=line.aggregate(2)(seqOP,comOp);

println(result);

------

说明:

reduce:接收一个函数作为参数,函数将两个相同元素类型的RDD数据并返回同一个类型的新元素.

fold:将两个RDD的内容合并成一个RDD,操作的是两个RDD.需要两个RDD中的元素类型是相同的.fold计算过程是这样的,

假如line 只有1个partition

第一个partition计算

第一次:1+1=2;

第二次:2+2=4;

第三次:3+4=7;

第四次:4+7=11;

combie计算:

第一次:11+1=12,最终结果:12

假如line 有2个partion【val line =sc.parallelize(List(1,2,3,4),2);】

第一个partition计算

第一次:1+1=2;

第二次:2+2=4;

第二个partition计算

第三次:3+1=4;

第四次:4+4=8;

combie计算:

第一次:4+1=5;

第二次:5+8=13

最终结果:13

aggregate:执行过程

//demo1执行过程

step1:(0+1,0+1)=(1,1)

step2:(1+2,1+1)=(3,2)

step3:(3+3,2+1)=(6,3)

step4:(4+6,3+1)=(10,4)

step5:(0+10,0+4)=(10,4)

avg=10/4=2.5

//demo2执行过程

step1:math.min(2,1)=1

step2:math.min(1,2)=1

step3:math.min(1,3)=1

step4:math.min(1,4)=1

step4:math.min(1,5)=1

step5:2+1=3

2.count/countByValue/take/top/takeOrdered

---------------------

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.count();

println(result);

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.countByValue();

println(result);

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.take(3);

result.foreach(println);

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.top(2);

result.foreach(println);

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.takeOrdered(2);

result.foreach(println);

val line=sc.parallelize(List(1,2,3,3),1);

val result=line.takeSample(false,2);

result.foreach(println);

------

说明:

count:返回RDD中元素的个数.

countByValue: 各元素在RDD中出现的次数.

take:从RDD中取出前n个元素个数,与collect比,都是从远程集群上获取元素,只是collect操作获取的所有数据,而take操作是获取前n个元素.

top:返回最前面的n个元素.

takeOrdered:从RDD中按照提供的顺序返回最前面n个元素.

takeSample:从RDD中返回任意一些元素.

---------------------

三、参考资料

1.fold计算过程-http://www.aboutyun.com/home.php?mod=space&uid=1&do=blog&id=368

2.fold计算过程-http://www.cnblogs.com/MOBIN/p/5414490.html#12

3.aggregate计算过程-https://www.iteblog.com/archives/1268.html

【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell的更多相关文章

  1. 【spark 深入学习 05】RDD编程之旅基础篇-01

    ---------------- 本节内容 1.RDD的工作流程 2.WordCount解说  · shell版本WordCount  · java版本WordCount -------------- ...

  2. 【Spark 深入学习 07】RDD编程之旅基础篇03-键值对RDD

    --------------------- 本节内容: · 键值对RDD出现背景 · 键值对RDD转化操作实例 · 键值对RDD行动操作实例 · 键值对RDD数据分区 · 参考资料 --------- ...

  3. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  4. ESP8266开发之旅 基础篇① 走进ESP8266的世界

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. ESP8266开发之旅 基础篇④ ESP8266与EEPROM

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  7. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...

随机推荐

  1. pyrhon SQLite数据库

    pyrhon SQLite数据库 目录 介绍 导入模块 创建数据库/打开数据库 创建表 在表中插入行 查询/修改 删除表中的行 删除表 介绍 Python SQLITE数据库是一款非常小巧的嵌入式开源 ...

  2. Hash值破解工具Hashcat使用

    Hash值破解工具Hashcat使用 Hashcat介绍 HashCat系列软件拥有十分灵活的破解方式,可以满足绝大多数的破解需求. Hashcat系列软件是比较牛逼的密码破解软件,系列软件包含Has ...

  3. Java—集合框架详解

    一.描述Java集合框架 集合,在Java语言中,将一系类的对象看成一个整体. 首先查看jdk中的Collection类的源码后会发现Collection是一个接口类,其继承了java迭代接口Iter ...

  4. 深入理解 Array.prototype.map()

    深入理解 Array.prototype.map() map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. 语法 let new_array = arr.map ...

  5. [COGS2554][SYZOJ247][福利]可持久化线段树

    思路: 主席树模板. 注意内存的分配,原始的线段树有$2n$个结点,每次更新时最多增加$log(n)$个结点,总共有$q$次询问,所以存储结点的数组大小为$2N+q log(n)$. #include ...

  6. 二分图带权匹配 KM算法与费用流模型建立

    [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小.而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大 ...

  7. Android Studio 使用过程遇到的坑

    最近在尝试Android Studio打Jar的包,然而事实并不是想象的那么简单,so,写多个坑的解决,以备不时之需. 1.Error:Execution failed for task ':app: ...

  8. ITxlab倡议启动“互联网X大脑”计划

    导语:"互联网X大脑"计划由ITxlab(互联网X实验室)联合科学院相关机构.基于7年以来取得的研究成果,倡议建立的互联网与脑科学前沿研究平台,吸引不同领域专家进行科学研究和成果交 ...

  9. 奇怪吸引子---GenesioTesi

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  10. C# CRC16 和汉明重量

    最近在看redis之类的pdf,发现redis在做集群的时候,不同的key分到不同的主服务器,其中划分key的算法采用CRC16算法,所以特此整理一下其C#code如下: #region CRC16 ...