第4篇: RDD学习

RDD(Resilient Distributed Dataset)弹性分布式数据集

Spark程序如何工作:

 

 即:

       step1:    从外部数据创建输入RDD

       step2:    使用诸如filter()这样的转换操作对RDD进行转换,以定义新的RDD

       step3: 告诉Spark对需要重用的中间结果RDD执行persist()操作

       step4: 使用行动操作(如count(), first()等)来触发一次并行计算,Spark会计算进行优化后再处理。 

第一部分:创建RDD

方式1  读取本地文件系统的数据集

最常用的    之前学过使用textFile()创建RDD

 方式2  常用的较简单的操作是:把程序中一个已有的集合传给SparkContext的parallelize()方法

这方法需要将整个数据集先放在一台机器的内存中

 lines = sc.parallelize(["pandas", "i like pandas"]) 

 

第二部分:RDD操作

         转换操作和行动操作(根据返回值的类型来判断具体是转换操作还是行动操作!)

 转换操作是返回一个新RDD的操作,如map()  ,  filter();  

 转换操作是惰性求值,只有在行动给操作用到这些RDD时才会被计算。

例子:对一个数据为{1,2,3,3}的RDD进行基本的RDD转换操作

 map例子: 对RDD中的每个元素计算,返回一个新的RDD

 collect()将驱动器程序中的RDD全部取出来存放在内存里。如果内存不够大,则不使用此函数。

如果只是取出部分,可以使用take(10),取出10个数据到内存。

flatMap例子:  flatMap()是对每个输入元素生成多个输出元素

 

我们来对比一下map()和flatMap()的区别:

也就是说flatMap()将返回的迭代器“拍扁”; 而map()返回的是由列表组成的RDD

剩下的转换操作  distinct(), union(), intersection(), subtract()

见下图:

 笛卡尔积cartesian()  笛卡尔积在我们希望考虑所有可能组合的相似度时比较有用,比如计算各用户对各种产品的于其兴趣程度,

如:

 

 行动操作是返回结果或者将结果写入外部系统的操作,会触发实际的计算,如count(), first()

         reduce() 累加或者累乘

 

对一个数据为     rdd = {1,2,3,3}     的RDD进行基本的RDD行动操作。

 

 这个aggregate()() 有些不理解

 

第三部分:持久化

为了避免多次计算同一个RDD,可以让Spark对数据进行持久化。

rdd.persist()

 更换参数,可以持久化到磁盘

 

 

举例:

 

 与之对应的,将持久化的RDD从缓存中移除

rdd.unpersist()

 

第四部分:分区

由于RDD的整个数据量是很大的,spark的一大特性就是对RDD数据分区,使数据分布到不同的工作节点上去

分区的好处:

     (1) 增加并行度

    (2)减少通讯开销

分区原则

  分区的个数尽可能地等于集群中CPU核心数目

       若CPU是8核的,那么数据也分8份,这样才会实现并行化。

 如果分区数目为4,则有四个核被浪费

若分数数目为16,则有8个分区需要等待

 

 如何设置分区数目

 

 如何用程序实现

(1)通过 sc.textFile(path,partitionNum)

  (2)   通过 sc.parallelize()

  (3) 重新分区  .repartition()

 (4) 自定义分区

 

posted @ 2020-02-29 17:03  lililili——  阅读(162)  评论(0)    收藏  举报