Spark(二)算子详解
Spark(二)算子讲解
@
一、wordcountcount
基于上次的wordcount,我们来写一个wordcountcount,来对wc程序进行第二次计数,我们来分析一下性能。
package com.littlepage.wc
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("wc").setMaster("local")
val sparkContext=new SparkContext(conf)
sparkContext.setLogLevel("error")
val fileRDD:RDD[String] = sparkContext.textFile("data/data")
val words:RDD[String] = fileRDD.flatMap(_.split(" "))
val pairWord:RDD[(String,Int)] = words.map((_,1))
val res:RDD[(String,Int)] = pairWord.reduceByKey(_+_)
println("wordcount:")
res.foreach(println)
val rev:RDD[(Int,Int)] = res.map((x)=>{(x._2,1)})
val pl:RDD[(Int,Int)] = rev.reduceByKey(_+_)
println("\nwordcountcount")
pl.foreach(println)
Thread.sleep(100000000)
}
}
通过性能图,我们可以知道:
1.Spark如果不对其结果进行存储或输出,那么Spark将不会处理map或者reduce操作
2.如果进行重复输出,共用的map或者reduce操作只执行一次
3.默认如果产生一次shuffle是去查看图表的一次拐弯,为了尽量减少性能的消耗,编写程序时应该尽量减少shuffle的次数
二、编程模型
Spark编程模型和MapReduce相比,Spark可以多个Job,多个State进行执行。
源码部分参考视频
三、RDD数据集和算子的使用
1.三个必备算子
我们在写一个Spark程序中,不可避免的算子有三个,创建算子,转换算子,收集算子。
创建算子可以创建一个RDD数据集,这个创建可以在内存中(集合容器),也可以在硬盘中(文件)获取
转换算子可以处理一个RDD数据集,即map和reduce操作,都算做转换算子。
收集算子我们在写一个RDD数据集的时候,必须使用收集算子进行收集,否则不会触发shuffle。
示例,三个算子写一个过滤数字程序。
package com.littlepage
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object demo2 {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("demo2").setMaster("local")
val sc=new SparkContext(conf)
sc.setLogLevel("error")
val dataRDD: RDD[Int] = sc.parallelize(List(1,2,3,4,5,6,7,6,5,4,3,2,1))//创建算子
val filterRDD: RDD[Int] = dataRDD.filter(_>3)//转换算子
val ints:Array[Int] = filterRDD.collect()//收集算子
Thread.sleep(100000)
}
}
package com.littlepage
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object demo2 {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("demo2").setMaster("local")
val sc=new SparkContext(conf)
sc.setLogLevel("error")
val dataRDD: RDD[Int] = sc.parallelize(List(1,2,3,4,5,6,7,6,5,4,3,2,1))//创建算子
val filterRDD: RDD[Int] = dataRDD.filter(_>3)//转换算子
val ints:Array[Int] = filterRDD.collect()//收集算子
Thread.sleep(100000)
}
}
2.常见算子(交并差笛卡尔,cogroup,join)
2.1.union算子
将两个数据集合并为一个数据集,直接合并,不会产生shuffle
object union {
def main(args: Array[String]): Unit = {
val sc=new SparkContext(new SparkConf().setMaster("local").setAppName("union"))
sc.setLogLevel("error")
val rdd1:RDD[Int] = sc.parallelize(List(1,2,3,4,6,7))
val rdd2:RDD[Int] = sc.parallelize(List(2,3,4,5))
val uniondata = rdd1.union(rdd2)
uniondata.foreach(print)
Thread.sleep(100000)
}
}
2.2.intersection算子
将2个数据集取交集,产生一个shuffle
val interdata:RDD[Int] = rdd1.intersection(rdd2)
2.3.substract算子
将2个数据集取差集,产生一个shuffle
val subdata:RDD[Int] = rdd1.substract(rdd2)
2.4.cartesian算子
将2个数据集取笛卡尔积,不产生shuffle
val cartesiandata:RDD[Int] = rdd1.cartesian(rdd2)
2.5.cogroup算子
两个分组进行,key作为结果的key,value集合进行一个二元祖,包含两个分区的元素,产生一个shuffle。
val rdd1:RDD[(String,Int)] = sc.parallelize(List(
("zhangsan",11),
("zhangsan",12),
("lisi",13),
("wangwu",14)
));
val rdd2:RDD[(String,Int)] = sc.parallelize(List(
("zhangsan",21),
("zhangsan",22),
("lisi",23),
("zhaoliu",28)
))
val cogroupdata:RDD[(String,(Iterable[Int],Iterable[Int]))] = rdd1.cogroup(rdd2)
6.join,leftOuterJoin,rightOuterJoin,fullOuterJoin算子
val joindata:RDD[(String,(Int,Int))] = rdd1.join(rdd2)
val leftdata:RDD[(String,(Int,Option[Int]))] = rdd1.leftOuterJoin(rdd2)
val rightdata:RDD[(String,(Option[Int],Int))] = rdd2.rightOuterJoin(rdd2)
val fulldata:RDD[(String,(Option[Int],Option[Int]))] = rdd1.fullOuterJoin(rdd2)
3.排序和聚合计算
3.1.swap算子
将一个k-v数据集的key和value交换,用法
data.map(_.swap)
3.2.sort算子
sort算子可以将按照key进行全排序
data.sortByKey()
3.3.take算子
获得数据的前n个,n为一个整型
data.take(n)
3.4.distinct去重
去除key相同的
val keys:RDD[(String,String) = map.distinct()
Spark(二)算子详解的更多相关文章
- Spark:常用transformation及action,spark算子详解
常用transformation及action介绍,spark算子详解 一.常用transformation介绍 1.1 transformation操作实例 二.常用action介绍 2.1 act ...
- ViewPager 详解(二)---详解四大函数
前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- Hexo系列(二) 配置文件详解
Hexo 是一款优秀的博客框架,在使用 Hexo 搭建一个属于自己的博客网站后,我们还需要对其进行配置,使得 Hexo 更能满足自己的需求 这里所说的配置文件,是位于站点根目录下的 _config.y ...
- 【模型推理】量化实现分享二:详解 KL 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 K ...
- Struts2学习笔记二 配置详解
Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...
- Apache Spark 内存管理详解(转载)
Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 ...
- EventBus (二) 使用详解——EventBus使用进阶
相关文章: 1.<EventBus使用详解(一)——初步使用EventBus> 2.<EventBus使用详解(二)——EventBus使用进阶> 一.概述 前一篇给大家装简单 ...
随机推荐
- 移动App书写Test Case时需要考虑的检查点
在测试工作中我们需要不断的总结和储备自己的知识和经验,譬如具备特定属性.环境以及场景,如:PC,手机,智能设备,特定网络环境下. 我们需要关注的功能点,容易出错的位置,这将对我们整个测试过程起至关作用 ...
- django model的update时auto_now不被更新的原因
gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...
- 解决X-Scan安装后“无法启动此程序,因为计算机丢失NPPTools.dll”
最近在一本书中看到X-Scan这个扫描器,虽说X-Scan相比现在的扫描器已经有点过时了,但也想下载来试一试,谁知道在VM中Win7安装时出现这种问题 可以在脚本之家找到缺失的这个文件:https:/ ...
- spring boot 2.x版本:java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBinder
标题 ##搭建spring boot 2.0.3版本 使用alibaba的druid数据库连接池,com.github.pagehelper的分页插件,启动项目报错. 错误提示:java.lang.C ...
- 某 游戏公司 php 面试题
1.实现未知宽高元素的水平垂直居中,至少两种方法. <div, class="father"> <div class="son">< ...
- LIUNX随堂学习-3 权限
1.权限分为三类:读r,写w,执行x 2.读r:可以ls改目录下的子文件名,子目录名 写w:可以在该目录下创建.删除.重命名 执行x:可以cd到该目录下 3. ll (ls -l) 下详细信息的意义 ...
- Python笔记day20-面向对象
目录 面向对象 1 装饰器 1.1 装饰器是什么? 1.2 装饰器 2 面向对象 (Object Oriented) 简称OO 2.1 面向对象相关术语 2.2 类和对象 2.3 类和对象的实现和书写 ...
- 2019杭电多校一 C. Milk (dp)
大意: $n*m$棋盘, 初始位置$(1,1)$, 横坐标为$\frac{m+1}{2}$时可以向下走, 否则只能左右走, 每走一步花费$1$秒. 有$k$管奶, 第$i$罐位置$(r_i,c_i)$ ...
- python __enter__ 与 __exit__的作用,以及与 with 语句的关系(转)
https://blog.csdn.net/xc_zhou/article/details/80810111 python __enter__ 与 __exit__的作用,以及与 with 语句的关系
- Nginx安装配置|Nginx反向代理|Nginx支持HTTPS|Nginx重定向
Nginx安装配置 可以直接看到最下面的HTTPS. Nginx安装 我的系统如下: No LSB modules are available. Distributor ID: Ubuntu Desc ...