Spark入门--RDD概述

Spark RDD 两大操作

Resilient Distributed Dataset - 弹性分布式数据集,是一个容错的,并行的数据结构,可以让用户显式的将数据存储到磁盘和内存中,并能控制数据的分区。

Transformation 转换

一个RDD经过计算后生成新的RDD

  • map
    map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD;RDD之间的元素是一对一关系
val rdd1 = sc.parallelize(1 to 9, 3).map(x => x*2)
  • filter
    filter是对RDD元素进行过滤;返回一个新的数据集,由经过func函数后返回值为true的原元素组成
val rdd2 = rdd1.filter(x => x > 10)
  • flatMap
    flatMap类似于map,但是每一个输入元素,会被映射为0或多个输出元素(因此,func函数的返回值是一个seq,而不是单一元素),RDD之间的元素是一对多关系
val rdd3 = rdd2.flatMap( x => x to 39)
  • mapPartitions
    mapPartitions是map的一个变种。map的输入函数是应用于RDD中的每个元素;而mapPartitions的输入函数是每个分区的数据,也就是把每个分区中的内容作为整体来处理的
def myfunc[T](iter: Iterator[T]): Iterator[(T, T)] = {...}
val rdd4 = rdd3.mapPartitions(myfunc)

当map里面有比较耗时的初始化操作时,比如链接和断开数据库,可以采用mapPartitions,它只需对每一个partition操作一次即可,函数的输入/输出都是iterator类型

  • mapPartitionsWithIndex
    mapPartitionsWithIndex与mapPartitions的功能类似,只是多传入split.index而已,所有func函数必须是(Int, Iterator<T>) => Iterator<U>类型

  • sample
    sample根据给定的随机种子seed,随机抽样出数量为frac的数据。

sample(withReplacement, fraction, seed)
// withReplacement: 是否放回抽样
// fraction: 比例,0.1表示10%
//seed: 随机种子,相同seed得到的随机序列是一样的,所以如果不设seed,同一段代码执行两遍得到的随机序列是一样的
  • union
    union是数据合并,返回一个新的数据集

  • intersection
    intersection是数据交集,返回一个新的数据集

  • distinct
    distinct是数据去重,返回一个数据集,numTasks是设置任务并行数量

  • groupByKey
    是数据分组操作,在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。

  • reduceByKey
    reduceByKey是数据分组聚合操作,在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集。key相同的值,都被使用指定的reduce函数聚合到一起。

  • aggregateByKey
    aggregateByKey和reduceByKey的不同在于,reduceByKey输入/输出都是(K,V);而aggreateByKey输出是(K,U),可以不同于输入(K,V)

  • combineByKey
    combineByKey是对RDD中的数据集按照key进行聚合操作。聚合操作的逻辑是通过自定义函数提供给combineByKey。

  • sortByKey
    sortByKey是排序操作,对(K,V)类型的数据按照K进行排序,其中K需要实现Ordered方法。第一个参数是ascending,默认true,升序。第二个参数是numTasks,即并行任务数

  • join
    join是连接操作,将输入数据集(K,V)和另外一个数据集(K,W)进行join,得到(K,(V,W));该操作是对于相同K的V和W的集合进行笛卡尔积操作,也即V和W的所有组合。

  • cogroup
    cogroup是将输入数据集(K,V)和另外一个数据集(K,W)进行cogroup,得到一个格式为(K,Seq[V],Seq[W])的数据集

  • cartesian
    cartesian是做笛卡尔积:对于数据集T和U进行笛卡尔积操作,得到(T,U)格式的数据集

  • pipe
    pipe是以shell命令处理RDD数据

  • randomSplit
    randomSplit对RDD按照权重进行数据分割,第一个参数为分割权重数组,第二个参数为随机种子,该方法用于样本划分中

  • subtract
    subtract是对RDD进行减法操作,将输入的rdd中的元素减去other中包含的元素。

  • zip
    zip是对两个RDD进行拉链操作,拉链操作还包括:zipWithIndex,zipPartitions

  • coalesce
    coalesce是将RDD进行重分区,默认不进行shuffle,且该RDD的分区个数等于numPartitions个数

  • repartition
    repartition是将RDD进行重分区,调整分区数量为numPartitions,会进行shuffle

  • treeAggregate
    treeAggregate是采用多层树模式进行RDD的聚合操作,类似于aggreateByKey。三个参数如下

    zeroValue: U,初始值,比如空列表
    seqOp:(U,T)=>U,seq操作符,描述如何将T合并入U,比如如何将item合并到列表
    combOp:(U,U)=>T,comb操作符,描述如何合并两个U,比如合并两个列表

Action 执行

返回结果到Driver程序,一般意味着RDD计算的结束。

  • reduce
    reduce是对数据集的所有元素执行聚集函数,该函数必须是可交换的

  • collect
    collect是将数据集中的所有元素以一个array的形式返回

  • count
    返回数据集中元素的个数

  • first
    返回数据集中的第一个元素

  • take
    take返回一个包含数据集中前n个元素的数组,当前该操作不能并行

  • takeSample
    takeSample返回包含随机的num个元素的数组。和Sample不同,takeSample是行动操作,所以返回的是数组而不是RDD。其中,第一个参数withReplacement是抽样时是否放回;第二个参数num会精确指定抽样数,而不是比例;第三个参数seed是随机种子,返回数组时,会进行随机排序

  • takeOrdered
    takeOrdered时返回包含随机的n个元素的数组,按照顺序输出

  • saveAsTextFile
    把数据集中的元素写到一个文本文件,Spark会对每个元素调用toString方法来把每个元素存成文本文件的一行

  • countByKey
    对于(K,V)类型的RDD,返回一个(K,Int)的map,Int为Key的个数

  • foreach
    foreach是对数据集中的每个元素都执行func函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值