Spark中的RDD相关

Spark中RDD的概念:

        RDD的英文全名是Resilient Distributed Dataset,直译就是弹性分布式数据集

        RDD是一个不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。

        很多资料里只有这么一句粗浅的解释,看起来说了很多,但是我们都get不到。细想有很多疑问,最后我在大神的博客里找到了详细的解释,这位大神翻了spark的源码,找到了其中RDD的定义,一个RDD当中包含以下内容:

  • 它是一组分区,分区是spark中数据集的最小单位。也就是说spark当中数据是以分区为单位存储的,不同的分区被存储在不同的节点上。这也是分布式计算的基础。
  • 一个应用在各个分区上的计算任务。在spark当中数据和执行的操作是分开的,并且spark基于懒计算的机制,也就是在真正触发计算的行动操作出现之前,spark会存储起来对哪些数据执行哪些计算。数据和计算之间的映射关系就存储在RDD中。
  • RDD之间的依赖关系,RDD之间存在转化关系,一个RDD可以通过转化操作转化成其他RDD,这些转化操作都会被记录下来。当部分数据丢失的时候,spark可以通过记录的依赖关系重新计算丢失部分的数据,而不是重新计算所有数据。
  • 一个分区的方法,也就是计算分区的函数。spark当中支持基于hash的hash分区方法和基于范围的range分区方法。
  • 一个列表,存储的是存储每个分区的优先存储的位置。

如何创建RDD:

        SparkContext是整个spark的入口,相当于程序的main函数。在我们启动spark的时候,spark已经为我们创建好了一个SparkContext的实例,命名为sc,我们可以直接访问到。

我们要创建RDD也需要基于sc进行,比如下面创建一个有字符串构成的RDD:

        对于已有集合可以通过parallelize函数进行初始化创建RDD:

text = sc.parallelize([1,2,3,4])

         也可以通过读取外部文件进行操作:

text = sc.textFile('/path/path/data.txt')

 RDD中的转化操作和行动操作:

        RDD支持两种操作,一种叫做转化操作(transformation)一种叫做行动操作(action)

转化操作

        执行转化操作的时候,spark会将一个RDD转化成另一个RDD。RDD中会将我们这次转化的内容记录下来,但是不会进行运算。所以我们得到的仍然是一个RDD而不是执行的结果。

        filter()

        比如我们创建了texts的RDD之后,我们想要对其中的内容进行过滤,只保留长度超过5的,我们可以用filter进行转化:

textAfterFilter = texts.filter(lambda x: len(x) > 5)

        我们调用之后得到的也是一个RDD,就像我们刚才说的一样,由于filter是一个转化操作,所以spark只会记录下它的内容,并不会真正执行。

        map()

        接收一个函数,然后把这个函数用于RDD中的每个元素,将函数的返回结果作为结果RDD中对应元素的值,不将其扁平化

        flatMap()

        将函数用于所有RDD,并且将其扁平化

        伪集合操作:

        distinct()

        保证RDD中的元素唯一

        Union()

        将两个RDD进行并集操作

        intersection()

        将两个RDD取交集

行动操作:

collect()操作:返回RDD中的所有元素

count()操作:返回RDD中的元素个数

countByValue()操作:个元素在RDD中的出现次数

take()操作:取几个元素出来

top()操作:从RDD中返回最前面的NUM个元素

reduce()操作:给reduce传递一个函数作为参数,rdd.reduce((x,y)=>x+y)    {1,2,3,3} =>9

fold()操作:给fold传递一个函数作为参数,同时对其进行初始化操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值