RDDs基本操作Transformation和action

来源:互联网 发布:制作视频字幕软件 编辑:程序博客网 时间:2024/06/06 00:03

首先先了解一下这些概念:

Spark 对数据的核心抽象—弹性分布式数据集(Resilient Distributed Dataset,简称 RDD)

RDD是一个不可变的分布式对象集合,一旦创建便不能修改。
每个RDD都可被分为多个分区,分布在不同的节点机器之上

转换:(Transformation):
转化操作会由一个 RDD 生成一个新的 RDD,从已有的RDD派生出新的RDD,Spark会使用谱系图来记录不同RDD之间的依赖关系。Spark需要用这些信息来按需计算每个RDD,也可以依赖谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据。

行动(action):
行动操作会对 RDD 计算出一个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统中

惰性计算:
当创建RDD或者从RDD派生RDD,spark都不会执行真正的计算,只有在第一次行动(action)执行时,才会执行真正的计算

Transformation:

map(func):把函数应用到RDD每一元素中,返回一个新的RDDfilter(func):过滤,返回一个只满足过滤条件的新的RDDflatMap(func):对每一个输入元素,输出多个输出元素 ,                     flat压扁的意思,将RDD压扁后返回一个新的RDD集合:distinct():去重  rdd.distinct()union():并集   rdd1.union(rdd2)intersection() 交集 rdd1.intersection(rdd2)subtract() 相减   rdd1.subtract(rdd2)

action:

在RDD上计算出来的一个计算 把结果返回给Driver program或保存到文件系统上,count(),savereduce:    接受一个函数,作用作用在RDD两个类型相同的元素上,返回一个新元素    可以实现RDD重元素的累加,计数,和其他类型的聚集操作val sum = rdd.reduce((x,y)=>x+y)collect:    遍历整个RDD,向driver program返回RDD的内容    需要单机内存能够容纳的下的(因为数据要拷贝个driver,测试使用)    大数据时候,使用saveAsTextFile() action操作take(n):    返回RDDn各元素(同时尝试访问最少的partitions)    返回结果是无序的,测试使用top:    排序(根据RDD中的比较器)foreach():        计算 RDD中的每一个元素,但不返回本地(只是访问一遍数据)        可以配合println()友好打印数据

这里写图片描述

这里写图片描述

keyValue对RDDs:

transform:

example:{(1,2),(3,4),(3,5)}reduceByKey(func):把具有相同的key的vlaue结合    reudecByKey((x,y)=> x+y) =>{(1,2),(3,9)}groupByKey():把相同的key的values分组    rdd.groupByKey() =>  {(1,[2]),(3,[4,5]}mapValues(func):函数作用于pairRDD的每一个元素,key值不变    rdd.mapValues(x=>x+1) =>{(1,3),(3,5),(3,6)}flatMapValues(func):符号化的时候使用     rdd.flatMapValues(x=>(x to 4) => {(1,2),(1,3),(1,4),(3,4)}keys():返回keysvalues():放回valuessortByKey():按照key排序RDDcombineByKey(createCombiner,mergeValue,mergeCombiners,partitioner):    把相同key的结合,使用不同的返回类型最常用的基于key 的聚合函数,返回类型和输入类型可能不一样    许多基于key的聚合函数都用到了它,如groupByKey()combineByKey():    遍历partition中的元素,元素的key,要么加过,要么没见过    如果是新元素,使用createCombiner()    如果是已经存在的key,使用mergeValue()    合计每个partiton的结果时使用mergeCombiners()    例子:    val te = sc.parallelize(Array(("jack",80),("jack",90),("tom",80),("tom",30)))val t1 = te.combineByKey(score=>(1,scorce),(c1:(Int,Int),newScore)=>(c1._1+1,c1._2+newScore),(c1:(Int,Int),c2:(Int,Int))=>(c1._1+c2._1,c1._2+c2._2))    t1.map(case(name,(num,score)=>(name,score/num)//判断case是否为自己想要的类型