第三章 RDD编程

本文介绍Spark中RDD的概念及其基本操作,包括如何创建RDD、执行转换操作和执行动作操作。通过实例演示了基本的RDD操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.1 RDD基础

RDD——弹性分布式数据集。每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含python、java、scala中任意类型的对象,甚至可以包含用户自定义的对象。
用户可以通过两种方式创建RDD:读取外部数据集和通过对象集合创建。
创建后的RDD支持两类操作:转化操作和行动操作。
转化操作会由一个RDD生成一个新的RDD。
行动操作会对RDD计算出一个结果,并把结果返回。
每个spark程序或者shell会话都按照如下方式工作:
1) 从外部数据创建出输入的RDD
2) 使用转化操作对RDD进行转化,定义新的RDD
3) 通知spark对需要被重用的中间结果RDD执行persist()操作
4) 使用行动操作来出发一次并行计算,spark会对计算进行优化后再执行。

3.2 创建RDD

读取外部数据,例如:
val lines=sc.textFile("readme.md")
对集合进行并行化,例如:
val lines=sc.parallelize(List("a","b","c"))

3.3 RDD操作

3.3.1 转化操作
转化操作返回新的RDD,是惰性操作。例如map()和filter()
3.3.2 行动操作
行动操作对数据集进行实际的计算。例如count()和take()
3.3.3 惰性求值
RDD的转化操作都是惰性求值,也就意味着在调用行动操作之前spark不会开始计算
spark惰性求值可以把一些操作合并到一起来减少计算数据的步骤。

3.4 常见的转化操作和行动操作

1.转化操作

1). 对一个RDD进行基本的RDD转化操作

例如对数据集{1,2,3,3}


2). 对针对两个RDD的转化操作

例如对数据集{1,2,3}和{3,4,5}

2.行动操作

例如对数据集{1,2,3,3}




### RDD编程的局限性及缺点分析 尽管RDD(Resilient Distributed Datasets)作为Spark的核心抽象,在大规模数据处理中表现出强大的性能和灵活性,但也存在一些固有的局限性和缺点: #### 1. **只读特性带来的限制** RDD是一种不可变的数据结构,一旦创建便无法更改。如果需要更新数据,则必须通过生成新的RDD来完成这一目标[^1]。这种设计虽然有助于简化并发控制和容错管理,但在某些场景下会增加额外的计算开销。 #### 2. **缺乏对细粒度操作的支持** RDD仅支持粗粒度的操作,这意味着所有的转换操作都需要作用于整个数据集而非单个记录或少量记录。因此,对于那些需要频繁修改个别元素的应用程序来说,例如数据库事务处理或者网页爬虫中的动态页面抓取,RDD显得不够高效甚至完全不合适[^1]。 #### 3. **较高的学习曲线与复杂性** 使用RDD进行编程通常涉及较为复杂的函数式编程概念,如`map`, `reduce`, 和其他各种变换方法。这可能使得初学者难以掌握其精髓所在,并且增加了编写错误的风险。相比之下,更高层次APIs像DataFrame/Dataset提供了更直观简洁的方式来进行数据分析任务[^2]。 #### 4. **内存压力与资源消耗** 尽管将中间结果存放在内存中有助于加速后续阶段的执行速度,但如果遇到非常庞大的数据量时,可能会超出可用RAM容量进而引发GC (Garbage Collection) 频繁发生等问题。此外,不当配置checkpoint可能导致过多不必要的序列化/反序列化进程,进一步加重系统负担[^3]。 #### 5. **有限的功能覆盖范围** 虽然RDD提供了广泛的基础构建模块供开发者自定义复杂工作流,但对于特定领域内的需求往往还需要借助第三方库扩展功能。比如时间序列分析、图像识别等领域专用工具包集成不足的情况就比较明显[^4]。 ```python # 示例代码展示如何利用RDD实现简单的word count统计 text_file = sc.textFile("hdfs://...") counts = text_file.flatMap(lambda line: line.split()) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) print(counts.collect()) ``` 以上是对RDD编程主要缺陷的一个总结说明,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值