操作RDD

transformation和action介绍

  1. Spark支持两种RDD操作:transformation和action。transformation操作会针对已有的RDD创建一个新的RDD;而action则主要是对RDD进行最后的操作,比如遍历、reduce、保存到文件等,并可以返回结果给Driver程序。例如,map就是一种transformation操作,它用于将已有RDD的每个元素传入一个自定义的函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。而reduce就是一种action操作,它用于对RDD中的所有元素进行聚合操作,并获取一个最终的结果,然后返回给Driver程序。
  2. transformation的特点就是lazy特性。lazy特性指的是,如果一个spark应用中只定义了transformation操作,那么即使你执行该应用,这些操作也不会执行。也就是说,transformation是不会触发spark程序的执行的,它们只是记录了对RDD所做的操作,但是不会自发的执行。只有当transformation之后,接着执行了一个action操作,那么所有的transformation才会执行。Spark通过这种lazy特性,来进行底层的spark应用执行的优化,避免产生过多中间结果。
  3. action操作执行,会触发一个sparkjob的运行,从而触发这个action之前所有的transformation的执行。这是action的特性。

案例解析:统计文件字数

1、通过案例“统计文件字数”,来讲解transformation和action

// 这里通过textFile()方法,针对外部文件创建了一个RDD,lines,但是实际上,程序执行到这里为止,spark.txt文件的数据是不会加载到内存中的。lines,只是代表了一个指向spark.txt文件的引用。 
val lines = sc.textFile(“spark.txt”)

// 这里对lines RDD进行了map算子,获取了一个转换后的lineLengths RDD。但是这里连数据都没有,当然也不会做任何操作。lineLengths RDD也只是一个概念上的东西而已。 
val lineLengths = lines.map(line => line.length)

// 之列,执行了一个action操作,reduce。此时就会触发之前所有transformation操作的执行,Spark会将操作拆分成多个task到多个机器上并行执行,每个task会在本地执行map操作,并且进行本地的reduce聚合。最后会进行一个全局的reduce聚合,然后将结果返回给Driver程序。 
val totalLength = lineLengths.reduce(_ + _)

2、通过图片详解

 对API的解释

1 transform

  • map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集
  • filter(func) : 对调用filter的RDD数据集中的每个元素都使用func,然后返回一个包含使func为true的元素构成的RDD
  • flatMap(func):和map差不多,但是flatMap生成的是多个结果
  • mapPartitions(func):和map很像,但是map是每个element,而mapPartitions是每个partition
  • mapPartitionsWithSplit(func):和mapPartitions很像,但是func作用的是其中一个split上,所以func中应该有index
  • sample(withReplacement,faction,seed):抽样
  • union(otherDataset):返回一个新的dataset,包含源dataset和给定dataset的元素的集合
  • distinct([numTasks]):返回一个新的dataset,这个dataset含有的是源dataset中的distinct的element
  • groupByKey(numTasks):返回(K,Seq[V]),也就是Hadoop中reduce函数接受的key-valuelist
  • reduceByKey(func,[numTasks]):就是用一个给定的reduce func再作用在groupByKey产生的(K,Seq[V]),比如求和,求平均数
  • sortByKey([ascending],[numTasks]):按照key来进行排序,是升序还是降序,ascending是boolean类型

2 action
  • reduce(func):说白了就是聚集,但是传入的函数是两个参数输入返回一个值,这个函数必须是满足交换律和结合律的
  • collect():一般在filter或者足够小的结果的时候,再用collect封装返回一个数组
  • count():返回的是dataset中的element的个数
  • first():返回的是dataset中的第一个元素
  • take(n):返回前n个elements
  • takeSample(withReplacement,num,seed):抽样返回一个dataset中的num个元素,随机种子seed
  • saveAsTextFile(path):把dataset写到一个text file中,或者hdfs,或者hdfs支持的文件系统中,spark把每条记录都转换为一行记录,然后写到file中
  • saveAsSequenceFile(path):只能用在key-value对上,然后生成SequenceFile写到本地或者hadoop文件系统
  • countByKey():返回的是key对应的个数的一个map,作用于一个RDD
  • foreach(func):对dataset中的每个元素都使用func




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值