写在前面:学习spark有近一个月,暂时补充RDDs算子方面的知识,每周日更新!加油!
1.RDDs:spark的主要抽象--弹性分布式数据集
RDDs的分布式可以体现在:它可被分发到集群各个节点上进行并行操作,最后将结果合并返回。
弹性体现在:spark在对RDDs操作时会自动的进行内存和磁盘数据存储的权衡和切换。
spark基于Lineage(血统关系图,下面会讲)的高效容错。
RDDs最后被分配成任务执行时,Task失败会自动进行特定次数的重试
spark基于Lineage(血统关系图,下面会讲)的高效容错。
RDDs最后被分配成任务执行时,Task失败会自动进行特定次数的重试
相对于MapReduce的map和reduce两种操作而言,spark扩充了更多的方法运用在RDDs的处理上。
2.RDDs支持两种类型操作:
①actions:在数据集上运行计算后返回值,实例:
var textFile = sc.textFile("file:///usr/local/spark/README.md"),这里需要注意的是,sc.textFile()中的文件路径默认读取HDFS中的文件,若读取本地文件,需要加file://前缀。
textFile.count()//计算RDD中item的数量,对于文本文件,就是总行数。
textFile.first()//RDD中第一个item,对于文本文件,就是第一行内容
textFile.count()//计算RDD中item的数量,对于文本文件,就是总行数。
textFile.first()//RDD中第一个item,对于文本文件,就是第一行内容
②transformations:转换,从现有数据集创建一个新的数据集,实例:
val lineWithSpark = textFile.filter(line =>line.contains("Spark"))//筛选出包含Spark的行
lineWithSpark.count()//统计行数
textFile.map(line=> line.split(" ").size).reduce((a,b)=>if(a>b) a else b)//找到包含单词最多一行内容共有几个单词。
textFile.map(line=> line.split(" ").size).reduce((a,b)=>if(a>b) a else b)//找到包含单词最多一行内容共有几个单词。
3.文件的读取,除了上述用textFile来新建RDD,还可直接新建集合构造RDD
val rdd = sc.parallelize(Array(1,2,3,4),4)//这是创建了一个四个片区partitions的整型rdd。这里应该会想到var和val的区别。val:变量值不可修改,一旦分配,不能重新指向别的值;var:分配后可指向其他值,但是前提必须类型相同。粗俗的理解就是:val常量,var变量。
4.匿名函数及类型推断
Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。例如:
val rdd =sc.textFile("file:///usr/local/1.txt")
val line=rdd.filter(line=>line.contains("hello"))//获取包含“hello”的行,即括号内的函数就是匿名函数,不需要指定参数line的类型,scala会进行类型推断,在此情境下li