Spark RDD数据集

Spark对数据的核心抽象为RDD 弹性分布式数据集,RDD其实就是分布式的元素集合,在Spark中,对数据的操作包括创建RDD、转化已有RDD以及调用RDD操作进行求值,而这些操作背后,Spark会自动将RDD中的数据分发到集群上,并将操作并行化执行

RDD是一个不可变得分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群中得不同节点,RDD可以包含Pyhton Java Scala中任意类型得对象,甚至可以包括用户自定义的对象

用户可以使用2种方法创建RDD 读取一个外部数据集,或在驱动去程序种分发驱动器程序的对象集合

lines=sc.textFile("test.txt")  //通过sc.textFile()生成一个字符串RDD

RDD支持2种操作:

转化操作 :由一个RDD生成一个新的RDD 如通过筛选进行转化

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

pythonlines=lines.filter(lambda line:"pyhton" in line) //转化操作filter()

pythonlines.first() //行动操作 获取RDD第一个元素返回给驱动器(如Spark Shell)

转化操作和行动操作区别在于Spark 计算RDD的不同方式,在任何时刻可以定义新的RDD,但Spark只会惰性的计算RDD,它们只会在第一次行动操作中,才会真正计算。 

这样延迟计算的原因:以之前例子为例,以一个文本文件定义了RDD数据,然后包包含"python"的行筛选出来,如果Spark在运行lines=sc.textFile(...)就把文件的所有行读取进并存储,就会消耗大量空间(可以类比单例模式中延迟初始化的实现),而之后会筛选掉许多无用数据,因此,如果Spark在了解了整个转化操作链后,它可以只计算结果需要的真正数据   如对于first()行动操作,那么可能的操作不是先全部加载数据,而是读取时扫描文件第一个匹配就结束

默认情况下,Spark的RDD会在每次对它们进行行动操作时重新计算,如果需要重复利用一个RDD 可以通过RDD.persist()让Spark把这个RDD缓存在内存,这样之后的行动操作中,就可以重复利用这些数据

一般而言,每个Spark应用程序或shell交互的流程是:

  • 从外部数据创建出输入RDD
  • 使用诸如filter()这样的转化操作对RDD转化,以定义新的RDD
  • 告诉Spark对需要重用的中间结果RDD 执行persist()缓存操作
  • 使用行动操作(count() first())触发计算,Spark在了解计算链基础上优化执行

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88775840