一、RDD变换

  1.返回执行新的rdd的指针,在rdd之间创建依赖关系。每个rdd都有一个计算函数和指向父rdd的指针

  Spark是惰性的,因此除非调用某个转换或动作,否则不会执行任何操作,否则将触发工作创建和执行。

  2.map()是对每个元素进行变换,应用变换函数,返回的是一个新的分布式数据集,map就是对分区中的每个元素进行一个函数的调用,所以导致出现了那么多;

  map()        //对每个元素进行变换,应用变换函数,(T)=>V,

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object WordCountDemoScala1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("WordCountDemoScala1");
conf.setMaster("local");
val sc = new SparkContext(conf);
val rdd1=sc.textFile("E:/studyFile/data/test.txt");
val rdd2 = rdd1.flatMap(line=>{ println("flatmap:"+line);line.split(" ")})
val rdd3 = rdd2.map((_,));
val rdd4 = rdd3.reduceByKey(_ + _);
val r = rdd4.collect();
r.foreach(println)
}
}

  3.mapPartitions()      //对RDD上的每个分区应用一个函数,返回一个新的RDD,输入的是一个迭代器,返回的是一个新的迭代器,可以对每个分区进行函数处理,而不是每个函数。现在是2个线程,四条数据,两条一切割


package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object WordCountDemo3 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("WordCountDemo3");
conf.setMaster("local[2]");//local[2]表示开启2个线程来模拟并发程序
val sc = new SparkContext(conf );
val rdd1 = sc.textFile("E:/studyFile/data/test.txt",2);//设置最小分区数为2
val rdd2 = rdd1.flatMap(_.split(" "));
val rdd3 = rdd2.mapPartitions(it=>{
import scala.collection.mutable.ArrayBuffer;
val buf = ArrayBuffer[String]();
val tname = Thread.currentThread().getName
println(tname+":"+"mapPartitions start");//将线程加入该分区
for (e<-it){
buf.+=("_"+e);
}
buf.iterator
});
val rdd4 = rdd3.map(word=>{
val tname=Thread.currentThread().getName
println(tname+":map"+word);
(word,1)})
val rdd5= rdd4.reduceByKey(_ + _);
rdd5.foreach(println)
}
}

  下面演示并发线程数为4,最小分区数为4

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object WordCountDemo3 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("WordCountDemo3");
conf.setMaster("local[4]");//local[4]表示并发线程数为4
val sc = new SparkContext(conf );
val rdd1 = sc.textFile("E:/studyFile/data/test.txt",);//设置最小分区数为4
val rdd2 = rdd1.flatMap(_.split(" "));
val rdd3 = rdd2.mapPartitions(it=>{
import scala.collection.mutable.ArrayBuffer;
val buf = ArrayBuffer[String]();
val tname = Thread.currentThread().getName
println(tname+":"+"mapPartitions start");//将线程加入该分区
for (e<-it){
buf.+=("_"+e);
}
buf.iterator
});
val rdd4 = rdd3.map(word=>{
val tname=Thread.currentThread().getName
println(tname+":map"+word);
(word,)})
val rdd5= rdd4.reduceByKey(_ + _);
rdd5.foreach(println)
}
}

    4.filter()          //过滤器,(T)=>Boolean,返回一个唯一满足滤条件元素的RDD

  5.flatMap()        //压扁,T=>TraversableOnce[U]同上,(Int,Interator)=>Iterator<U>

  6.sample(withReplacement,fraction,seed)    //采样,返回采样的RDD子集。withReplacement元素是否可以多次采样,fraction:期望采样的数量[0,1]

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object SampleDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("SampleDemo");
conf.setMaster("local");
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/studyFile/data/test.txt");
val rdd2= rdd1.flatMap(_.split(" ")); val rdd3= rdd2.sample(false,0.5);//可以替换,被抽中的概率是0.5
rdd3.collect().foreach(println)
} }

  7.mapPartitionsWithIndex(func)    //同上(int Iterator<T>)=Iterator<u>。与map函数相类似,但是也提供一个代表分区索引的整数的函数,所以当运行一个T类型的RDD的时候这个函数的类型必须是(Int,Iterator<T>)类型的,

  8.union()            //类似于mysql的union操作,返回一个新的数据集,其中包含元数据集和参数中 数据集的并集。

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object UnionDemo1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("UnionDemo1")
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/studyFile/data/test.txt");
//所有hello行
val helloRDD=rdd1.filter(_.toLowerCase.contains("hello"));
//所有world行
val worldRDD=rdd1.filter(_.toLowerCase.contains("world")); val allRDD=helloRDD.union(worldRDD);
allRDD.collect().foreach(println) } }

                  //select * from persons where id<10  unoin select * from id persons where id>29

  9.intersection          //取出交集,提取两个rdd都含有的元素

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object IntersectionDemo1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("IntersectionDemo1");
conf.setMaster("local");
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/studyFile/data/test.txt");
val rdd2 = rdd1.flatMap(_.split(" "));
val helloRDD = rdd2.filter(_.toLowerCase.contains("llo"));
val worldRDD=rdd2.filter(_.toLowerCase.contains("wor"));
val intersectRDD= helloRDD.intersection(worldRDD);
intersectRDD.collect().foreach(println)
}
}

  10.distinct([numTasks])      //去重操作

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object DistinctDemo{
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setMaster("local")
conf.setAppName("DistinctDemo");
val sc = new SparkContext(conf);
val rdd1 =sc.textFile("E:/studyFile/data/test.txt");
val rdd2 = rdd1.flatMap(_.split(" "));
val rdd3= rdd2.distinct()
rdd3.collect().foreach(println)
}
}

  11.reduceByKey(*)        //按照key进行聚合

  12.groupByKey()          //按照key进行分组(K,V)=>(k,Iterable<V>),当你在(K,V)对上调用这个函数的时候,结果会返回一个可以迭代的量(K,Iterable<V>),相同key值的数据别合在一起了。

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object GroupByKeyDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("GroupByKeyDemo")
conf.setMaster("local");
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/codes/stus.txt");
val rdd2 = rdd1.map(line=>{
val key = line.split(" ")()
(key,line); });
//通过key来进行分组
val rdd3 = rdd2.groupByKey();
rdd3.collect().foreach(t=>{
val key = t._1;
println(key+":=================================================================>")
for(e <- t._2){
println(e)
} }) } }

  13.reduceByKey(func,[numTasks])

  当在(k,v)键值对上调用一个数据结集的时候,结果返回一个键值对,其中每个键对应的值都给定一个聚合函数func进行聚合,其类型必须是(V,V)=>V。同groupByKey一样,reduce的任务数通过第二个可选的参数进行指定

  14.sortByKey([ascending],[numTasks])    //按key进行排序

  15.join(otherDataset,[numTasks])      //横向连接,按key来进行联合,当你调用数据集(K,V)和(K,W)的时候,会返回一个新的数据集(K,(V,W))

  16.cogroup协分组      //(K,V).cogroup(K,W)=>(K,(Iterable<V>,Iterator<W>))

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object CogroupDemp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setAppName("CogroupDemp");
conf.setMaster("local[4]");
val sc = new SparkContext(conf);
val rdd1 =sc.textFile("E:/codes/cogroup-1.txt")
val rdd2 =rdd1.map(line=>{
val arr = line.split(" ");
(arr(),arr());
}); val rdd3 = sc.textFile("E:/codes/cogroup-2.txt");
val rdd4 = rdd3.map(line=>{
val arr = line.split(" ");
(arr(),arr())
});
val rdd = rdd2.cogroup(rdd4);
rdd.collect().foreach(t=>{
println(t._1+":============================================>")
for(e<-t._2._1){
println(e)
}
for (e<-t._2._2){
println(e)
}
})
}
}

  17.cartesian(otherDataset)  //笛卡尔积,RR[T]=>RDD[(T,U)]。调用类型T和类型U的数据集,返回(T,U)所对的数据集

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

//计算笛卡尔积
object cartesianDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setMaster("local[4]");
conf.setAppName("cartesianDemo");
val sc = new SparkContext(conf);
val rdd1 = sc.parallelize(Array("tom","jack","peter","stone","mike"));
val rdd2 = sc.parallelize(Array("","","",""));
val rdd3 = rdd1.cartesian(rdd2);
rdd3.collect().foreach(t=>println(t))
} }

  18.pipe          //将rdd的元素传递给脚本或者命令

  19.coalesce(numPartitions)  //降低RDD中的分区数到指定的分区数

  20.repartition        //重新分区,分区数可增可减

package com.jd.test

import org.apache.spark.{SparkConf, SparkContext}

object SaveAsTextDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("SaveAsTextDemo");
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/codes/test.txt");
val rdd2 = rdd1.flatMap(_.split(" "));
val rdd3 = rdd2.map((_,));
//Merge the values for each key using an associative and commutative reduce function. This will
// * also perform the merging locally on each mapper before sending results to a reducer, similarly
// * to a "combiner" in MapReduce.
val rdd4 = rdd3.reduceByKey(_ + _,);//指定分区数为3,按key聚合,同时还指定分区数
rdd4.saveAsTextFile("E:/codes/out") }
}

  21.repartiotion        //在RDD中重新进行shuffle操作,来随机的创建更多或者更少的分区,以及通过他们来进行分区的平衡,这经常用在网络间数据的shuffle

  22.repartitionAndSortWithinPartitions(partitioner)    //再分区并且排序

二、RDD Action

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

  1.collect()      //在客户端返回数据集的所有元素来作为数组,这在筛选器或其他操作返回足够小的数据子集之后非常有用。

  2.reduce()      //使用函数func(携带两个参数并返回一个参数)聚合数据集的元素,函数应该可以通信以及关联

  3.count        //返回数据集中RDD元素的个数,形成数组,手机RDD元素形成数组

  4.first          //只取第一个元素

  5.take(n)        //去除前n个元素

  6.takeOrdered(n,[ordering])  //返回RDD的前n个元素,使用自然顺序或者用户比较器

  7.saveAsTextFile(path)    //保存到文件中去

  8.saveAsSequenceFile(path)  //保存成序列文件

  9.countByKey()        //按照key进行统计

三、Spark数据倾斜

    数据倾斜问题,map阶段对key进行重新划分

spark复习笔记(4):RDD变换的更多相关文章

  1. spark复习笔记(6):RDD持久化

    在spark中最重要的功能之一是跨操作在内存中持久化数据集.当你持久化一个RDD的时候,每个节点都存放了一个它在内存中计算的一个分区,并在该数据集的其他操作中进行重用,持久化一个RDD的时候,节点上的 ...

  2. Spark学习笔记3——RDD(下)

    目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...

  3. Spark学习笔记2——RDD(上)

    目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...

  4. spark复习笔记(1)

    使用spark实现work count ---------------------------------------------------- (1)用sc.textFile(" &quo ...

  5. spark复习笔记(7):sparkstreaming

    一.介绍 1.sparkStreaming是核心模块Spark API的扩展,具有可伸缩,高吞吐量以及容错的实时数据流处理等.数据可以从许多来源(如Kafka,Flume,Kinesis或TCP套接字 ...

  6. spark复习笔记(2)

    之前工作的时候经常用,隔了段时间,现在学校要用学的东西也忘了,翻翻书谢谢博客吧. 1.什么是spark? Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPL ...

  7. Spark学习笔记之RDD中的Transformation和Action函数

    总算可以开始写第一篇技术博客了,就从学习Spark开始吧.之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pys ...

  8. spark复习笔记(7):sparkSQL

    一.saprkSQL模块,使用类sql的方式访问Hadoop,实现mr计算,底层使用的是rdd 1.hive //hadoop  mr  sql 2.phenoix //hbase上构建sql的交互过 ...

  9. spark复习笔记(5):API分析

    0.spark是基于hadoop的mr模型,扩展了MR,高效实用MR模型,内存型集群计算,提高了app处理速度. 1.特点:(1)在内存中存储中间结果 (2)支持多种语言:java scala pyt ...

随机推荐

  1. linux运维、架构之路-禅道环境搭建

    一.介绍            禅道项目管理软件是国产的开源项目管理软件,专注研发项目管理,内置需求管理.任务管理.bug管理.缺陷管理.用例管理.计划发布等功能,实现了软件的完整生命周期管理. 禅道 ...

  2. 使用 flex 弹性布局 ,相关教程记录

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box1{ dis ...

  3. JS循环结构

    什么是循环结构? 反复一遍又一遍做着相同(相似)的事情 循环结构的两大要素? 循环条件:什么时候开始,什么时候结束 循环操作:循环体,循环过程中 做了什么 一.while语句 while语句 属于前测 ...

  4. CSS3实现三角形和对话框

    这是最终实现的效果,类似于微信对话框的样式. 分析一下这个对话框的结构,由一个小三角形和一个长方形构成.长方形很容易就可以实现,重点是如何用CSS3做出一个小三角形. 一.如何生成一个三角形  总结: ...

  5. Jupyter配置Spark开发环境

    兄弟连大数据培训和大家一起探究Jupyter配置 Spark 开发环境 简介 为Jupyter配置Spark开发环境,可以安装全家桶–Spark Kernel或Toree,也可按需安装相关组件. 考虑 ...

  6. 倍增O(1)求区间&值与|值

    ;i<=n;++i) f[i][]=a[i],g[i][]=a[i]; ;(<<j)<=n;++j) ;(i+(<<j)-)<=n;i++) { f[i][j ...

  7. Django REST framework入门 (转自中文文档)

    快速入门 我们将创建一个简单的允许管理员用户查看和编辑系统中的用户和组的API. 项目设置 创建一个名为 tutorial 的新django项目,然后启动一个名为 quickstart 的新app. ...

  8. C++ 对象间通信框架 V2.0 ××××××× 之(五)

    类定义: ======================================================================= // MemberFuncPointer.h: ...

  9. [CF Round603 Div2 F]Economic Difficulties

    题目:Economic Difficulties 传送门:https://codeforces.com/contest/1263/problem/F 题意:给了两棵tree:Ta(拥有a个节点,节点编 ...

  10. Java 静态static 关键字作用

    静态的方法1.可以通过类名打点访问2.不能使用this关键字3.不能访问非静态的属性和方法 /* * 静态的方法: * 1.属于类的方法,可以通过类名打点访问 * 2.方法中不能使用this关键字 * ...