Spark RDD Cache算子的作用

    我们经常会对RDD执行一系列Transformation算子操作,逻辑上每经历一次变换,就会将RDD转换为一个新的RDD,RDD会被划分成很多的分区分布到集群的多个节点中。

    分区是逻辑概念,为了防止函数式数据不可变行(immutable)导致的内存需求无限扩张,使得系统内存被快速用完,Spark使用延迟执行(lazy)的方式执行,即只有操作累计到Action(行动),算子才会触发整个操作序列的执行,中间结果不会单独再重新分配内存,而是在同一个数据块上进行流水线操作。

    也就是说变换前后的新旧RDD的分区在物理上可能是同一块内存存储,这是Spark内部做的优化。有些RDD是计算的中间结果,其分区并不一定有相对应的内存或磁盘数据与之对应,所以如果想要复用某一个RDD,需要通过Cache算子,将数据缓存(或者说固化)到内存中。

### 创建RDD 在Apache Spark中,可以通过并行化集合或读取外部数据源来创建弹性分布式数据集(Resilient Distributed Dataset, RDD)。对于Scala和Python这两种编程语言而言,操作方式有所不同。 #### 使用Scala创建RDD 通过`SparkContext.parallelize()`方法可以将已有的集合转换成RDD。下面是一个简单的例子: ```scala val sc = new org.apache.spark.SparkContext("local", "First App") // 并行化现有数组到集群上形成RDD val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) ``` 为了从本地文件系统中的文件创建RDD,同样利用`textFile`函数指定路径即可[^1]。 ```scala // 从本地文件创建RDD val logData = sc.textFile("file:///path/to/local/file.txt").cache() ``` #### 使用Python创建RDD PySpark提供了几乎相同的API用于处理相同的操作,在这里展示如何用Python实现上述功能: ```python from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName('FirstApp') sc = SparkContext(conf=conf) # 将列表转化为RDD data = [1, 2, 3, 4, 5] dist_data = sc.parallelize(data) # 从本地文件载数据作为RDD log_data = sc.textFile("/path/to/local/file.txt").cache() ``` ### 转换与动作运算符的应用 一旦有了RDD之后就可以应用各种各样的转换(`Transformations`)和行动(`Actions`)操作来进行数据分析工作了。 #### Transformations变换 这些是懒惰求值的,意味着它们不会立即执行计算;相反,它们只是记录下要应用于基础数据上的操作序列。常见的有map()、filter()等。 ##### Scala版本: ```scala // 对每个元素乘以2再过滤掉小于等于8的结果 val multipliedFiltered = distData.map(_ * 2).filter(_ > 8) ``` ##### Python版本: ```python # 同样地对每个元素倍后再筛选大于8的数据项 multiplied_filtered = (dist_data .map(lambda x: x * 2) .filter(lambda y: y > 8)) ``` #### Actions行为 当调用了action类型的命令时才会触发实际的任务提交给集群去运行之前定义好的一系列transformation指令链路。collect(), count()都是常用的actions之一。 ##### Scala实例: ```scala println(multipliedFiltered.collect().mkString(", ")) println(s"Total elements after transformation: ${multipliedFiltered.count()}") ``` ##### Python实例: ```python print(",".join(map(str, multiplied_filtered.collect()))) print(f"Total elements after transformation: {multiplied_filtered.count()}") ``` 以上就是关于怎样使用Scala或者Python编写基本的Spark应用程序来创建RDD、读取本地文件生成RDD以及运用Transformation和Action算子的方法介绍[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值