【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell
---------------------
本节内容:
· 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的更多相关文章
- 【spark 深入学习 05】RDD编程之旅基础篇-01
---------------- 本节内容 1.RDD的工作流程 2.WordCount解说 · shell版本WordCount · java版本WordCount -------------- ...
- 【Spark 深入学习 07】RDD编程之旅基础篇03-键值对RDD
--------------------- 本节内容: · 键值对RDD出现背景 · 键值对RDD转化操作实例 · 键值对RDD行动操作实例 · 键值对RDD数据分区 · 参考资料 --------- ...
- Spark学习之RDD编程(2)
Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...
- ESP8266开发之旅 基础篇① 走进ESP8266的世界
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇④ ESP8266与EEPROM
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- Spark学习之RDD编程总结
Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...
随机推荐
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- HDU 2602 Bone Collector 骨头收集者【01背包】
题目链接:https://vjudge.net/contest/103424#problem/A 题目大意: 第一行输入几组数据,第二行第一个数字代表物体个数,第二个数代表总体积.需要注意的是,第三排 ...
- Java内存管理-程序运行过程(一)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...
- SQL server学习(四)T-SQL编程之事务、索引和视图
今天来分享下T-SQL高级编程中的事务.索引.视图,可以和之前的SQL server系列文章结合起来. 一.事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个 ...
- 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)
#斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...
- crm的知识点整理
''' # 1. 通过ChangeList封装好多数据 # 2. 销售中公共资源:Q查询,3天 15天 from django.db.models import F,Q F 使用查询条件的值,专门取对 ...
- 2016年3月15日Android实习日记
1.解决了ScrollView滑动冲突问题. 2.设置好了“查看详解”与“题目编号”的部分. 3.完成了app启动图片的设置,并在启动的过程中开辟新的线程连接服务器并开启监听数据. 别忘了注册启动Ac ...
- 【NOIP2018】【RP++!】【神大退役记+一丢丢回忆录】
emmm初赛都完了啊,还有20多天的样子退役选手又要++++++了 所以在这里先预祝各路dalao取得好成绩!! 手动艾特亲友$@Abyssful@阿澈说他也想好好学习@Ed\_Sheeran@歪瓜是 ...
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...
- [Python] 文件扫描
文件扫描 下载 https://github.com/YouXianMing/FileManager 细节 1. 基于Python 3.60,其他版本未测试 2. 支持扫描深度,不设置则扫描全部,设置 ...