Spark-RDD编程基础

来源:互联网 发布:newsql数据库有哪些 编辑:程序博客网 时间:2024/05/29 10:43

RDD是弹性分布式数据集的缩写,是Spark对数据的核心抽象,在Spark中对数据的操作无外乎是创建RDD转化RDd对RDD求值

每个RDD被分为多个分区,这些分区运行在集群的不同节点上。

创建RDD

创建RDD的方式有两种,一种是读取一个外部是数据集,一种的分发驱动程序中的对象集合。

#读取外部数据集val lines = sc.textFile("/root/Desktop/wc.txt")#分发驱动器总的对象集合val lines = sc.parallelize(List(1,2,3,4,5,6))

RDD的操作类型

对RDD的操作大致分为两种,一种是转化操作,另一种是行动操作。转化操作会将原有的RDD中的数据转换后生成一个新的RDD,行动RDD会对RDD计算出一个结果。
例如:

 #转换操作 val result1 = lines.filter(line->line.contains("error")) #行动操作 val arrs = sc.parallelize(List(1,2,3,4)) val nums = arrs.map(num-> num * 2) //here val result2 = nums.count()

对于创建和转换RDD的操作,Spark会惰性操作。同时,在默认情况下,每次执行行动操作时,spark都会重新计算RDD,为避免这种情况,可以利用RDD的persist或cache函数来缓存中间结果,避免反复的重新计算。

常见的RDD操作

转换操作

map/filter/flatMap/distinctunion/intersection/subtract/cartesian(笛卡尔积)

行动操作

reduce/fold  等

持久化/缓存

由于SparkRDD是惰性求值,但有时我们系统在多次计算中使用同一个RDD,如果简单的对RDD调用行动操作,Spark每次都会重新计算RDD及其依赖,这在迭代计算中非常消耗资源。

为了避免对同一RDD做重复计算,可以让Spark对RDD进行持久化,当让Spark持久化一个RDD时,计算RDD的节点会分别保存它们计算出来的数据。

处于不同的目的,我们可以为RDD选择不同的持久化级别、

StorageLevel.MEMORY_ONLYStoregeLevel.MEMORY_ONLY_SERStorageLevel.MEMORY_AND_DISKStorageLevel.MEMORY_AND_DISK_SERStorageLevel.DISK_ONLY

示例:

>spark-shell>import org.apache.spark.storage.StorageLevel>val input = sc.parallelize(List(1,2,3,4,5))>val r1 = input.map(x=>x * x)#持久化>r1.persist(StorageLevel.MEMORY_ONLY)>r1.sumres5: Double = 55.0

对于内存级别的持久化,当数据大小超出了内存容量时,Spark会利用LRU策略清除内存中最老的RDD,同时,如果再次用到已经被移除的RDD,Spark会对其重新计算。

最后,可以用unpersist()方法手动将RDD从缓存中移除。

0 0
原创粉丝点击