RDD操作(3)

本文详细介绍了如何在Spark中创建RDD,包括并行化现有集合和引用外部存储系统数据集的方法。同时,提供了关于Spark读取文件的实用技巧,如设置分区数、读取目录与压缩文件及使用通配符。

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

一、如何创建RDD?

1.parallelizing an existing collection in your driver program:并行化一个现有的集合来创建RDD

Example:
scala> val data=Array(1,2,3,4,5)
data: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val dts=sc.parallelize(data)
dts: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:26

scala> dts.collect
res0: Array[Int] = Array(1, 2, 3, 4, 5)        

问题:这个task 2个咋来的?

答:Spark will run one task for each partition of the cluster,一个partition就有一个task,这个2就是partition决定的。

例如:HDFS通常就是根据你的blocksize大小来表示一个task,小文件会多。

问题:为什么通常一个cpu设置2-4个分区呢?

Typically you want 2-4 partitions for each CPU in your cluster

答:如果一个core对应一个task,很多情况下会出现你的core空闲,前面跑完,后面的接上,避免浪费资源。

2.referencing a dataset in an external storage system

 such as a shared filesystem, HDFS, HBase, or any data source offering a Hadoop InputFormat:引用外部存储系统的数据集

(1)Text file RDDs can be created using SparkContext’s textFile method.

使用这个方法,如果使用的是分布式spark,那么你的inputsource必须在每个worker上都要有,也就是你不要用个standalone,textfile又是local的文件,这样会报找不到数据源的。

val dts=sc,TextFile("hdfs://192.168.137.251:8020/ruozedata.txt")

二、Some notes on reading files with Spark:(关于Spark读取文件的一些注意事项)

(1)如果使用的本地文件系统(file开头的路径),文件也必须在工作节点上的同一路径上可访问。要么将文件复制到所有工作者,要么使用一个挂载网络的共享文件系统。

(2)可以读取目录下的所有文件,也可以读取压缩文件,还可以读取wildcards(通配符)比如/a/*.txt这样读取所有txt的文件。

(3)textFile方法手动设置分区,默认情况下在hdfs上市以一个block作为默认的partition大小,也可以自己设置,但是分区数目不能少于partition数目。

val rdd=sc.wholeTextFiles("hdfs://192.168.137.251:9000/data")
rdd: org.apache.spark.rdd.RDD[(String, String)] = hdfs://192.168.137.251:9000/data MapPartitionsRDD[5] at wholeTextFiles at <console>:24

scala> rdd.collect
res2: Array[(String, String)] =
Array((hdfs://192.168.137.251:9000/data/1,"
ruoze
laoj
hello
ptthon
zidong
youmuyou
"), (hdfs://192.168.137.251:9000/data/2,"
ruoze
laoj
hello
ptthon
zidong

(4)

<think>好的,我现在需要回答用户关于RDD基本操作的问题。用户之前询问了深度学习中的CNN、RNN和GAN,现在转向了Spark的RDD操作,可能是想了解大数据处理的相关知识。 首先,我需要确认RDD是什么。RDD即弹性分布式数据集,是Spark的核心数据结构,具有不可变、分布式、容错等特性。用户需要的是基本操作,可能包括转换和动作两大类。 接下来,要回忆RDD的两种操作类型:转换(Transformations)和动作(Actions)。转换操作是惰性的,不会立即执行,而动作操作会触发实际计算。常见的转换操作有map、filter、flatMap、groupByKey等,动作操作如collect、count、reduce、saveAsTextFile等。 需要分点说明,结构清晰。可能先介绍RDD概念,再分转换和动作,然后举例说明,最后注意事项。需要注意使用中文,符合用户要求,同时按照之前的系统级指令,数学公式用$...$,独立公式用$$...$$,但RDD操作可能涉及代码示例,是否需要使用LaTeX?比如代码中的函数名可能需要用等宽字体,但用户之前的例子中用了代码块,但这里用户可能希望用中文描述,避免代码块。 另外,用户之前的回答使用了分点、表格对比,可能需要保持类似的风格。比如分转换操作和动作操作,每个操作下给出例子,如map、filter的具体使用,以及它们的延迟执行特性。 还要注意提到RDD的惰性求值机制,以及持久化方法如cache和persist的作用,如何避免重复计算。可能还需要提到宽依赖和窄依赖的区别,但用户问的是基本操作,可能不需要深入依赖关系。 需要检查是否有错误,比如转换操作是否返回新RDD,动作操作是否返回结果或导出数据。例如,collect返回数据到驱动程序,reduce进行聚合,saveAsTextFile保存到文件系统。 另外,用户可能对RDD操作的并行性和容错机制感兴趣,但可能属于更高级内容,但基本操作介绍中可能需要简要提及分区和血统(lineage)的概念,以说明容错机制。 最后,总结注意事项,如避免使用collect处理大数据,可能导致内存溢出,合理使用持久化优化性能等。 现在需要组织这些内容,用中文分点回答,保持结构清晰,符合用户之前的回答风格,可能使用标题如“核心概念”、“转换操作”、“动作操作”、“注意事项”等,每个部分下给出具体操作示例和解释,必要时用LaTeX公式,比如在说明reduce操作时,可能给出函数示例,如$f(x,y) = x + y$,但大部分操作为代码函数名,可能用中文引号标注,如map()、filter()等。 需要确保术语正确,比如转换操作生成新的RDD,动作触发作业执行。同时,示例要简单明了,比如map用于元素处理,filter筛选元素,reduce进行聚合等。 总结后,可能需要一个对比表格,比较转换和动作的区别,如是否立即执行、返回类型等,类似用户之前对比CNN、RNN、GAN的表格,但需要确认是否有必要。 最终,确保回答准确、结构清晰,符合用户的要求,并帮助用户逐步理解RDD的基本操作。</think>### RDD(弹性分布式数据集)基本操作详解 #### **一、核心概念** RDD(Resilient Distributed Dataset)是Spark的核心数据结构,具有以下特性: - **分布式存储**:数据分片存储在集群节点上 - **容错性**:通过**血统(Lineage)**记录数据生成过程,可自动恢复丢失分区 - **不可变性**:操作生成新RDD,原始数据保持不变 - **惰性求值**:转换操作延迟执行,遇到动作操作时触发计算 #### **二、基本操作分类** ##### **1. 转换操作(Transformations)** 生成新RDD的**延迟计算**操作,需通过动作操作触发执行: - **`map(func)`** 逐元素处理:$newRDD = rdd.map(x \Rightarrow x*2)$ 示例:`[1,2,3] → [2,4,6]` - **`filter(func)`** 筛选满足条件的元素:$newRDD = rdd.filter(x \Rightarrow x>3)$ 示例:`[5,2,7] → [5,7]` - **`flatMap(func)`** 先映射后扁平化:$newRDD = rdd.flatMap(x \Rightarrow x.split(" "))$ 示例:`["hello world"] → ["hello", "world"]` - **`groupByKey()`** 键值对分组(需PairRDD):$newRDD = rdd.groupByKey()$ 示例:`[(a,1),(b,2),(a,3)] → [(a,[1,3]), (b,[2])]` - **`reduceByKey(func)`** 按键聚合:$newRDD = rdd.reduceByKey((x,y) \Rightarrow x+y)$ 示例:`[(a,1),(a,2)] → [(a,3)]` ##### **2. 动作操作(Actions)** 触发计算并返回结果/输出数据的**立即执行**操作: - **`collect()`** 返回所有元素到驱动程序 **注意**:数据量大时易导致内存溢出 - **`count()`** 统计元素总数:$count = rdd.count()$ 示例:`[1,3,5] → 3` - **`reduce(func)`** 聚合元素:$result = rdd.reduce((x,y) \Rightarrow x+y)$ 示例:`[1,2,3] → 6`(求和) - **`saveAsTextFile(path)`** 保存到分布式文件系统(如HDFS) 输出格式:每个分区生成一个文件 - **`foreach(func)`** 对每个元素执行操作(如写入数据库) #### **三、操作特性对比** | 操作类型 | 执行时机 | 返回值 | 示例方法 | |------------|----------|-----------------|------------------------| | 转换操作 | 延迟 | 新RDD | map, filter, groupByKey| | 动作操作 | 立即 | 非RDD(值/输出)| collect, count, reduce | #### **四、关键注意事项** 1. **持久化优化** 使用`persist()`或`cache()`缓存重复使用的RDD,避免重复计算: ```python rdd = sc.parallelize([1,2,3]).cache() # 缓存到内存 ``` 2. **宽窄依赖** - 窄依赖:1个父RDD分区对应1个子RDD分区(如`map`) - 宽依赖:1个父RDD分区对应多个子RDD分区(如`groupByKey`) 3. **避免数据倾斜** 对`groupByKey`/`reduceByKey`使用盐值分桶等技巧,平衡负载 4. **资源管理** - 合理设置分区数:`repartition(n)`调整并行度 - 监控`Spark UI`查看任务执行状态 #### **五、操作流程示例** ```python # 1. 创建RDD rdd = sc.parallelize([1,2,3,4,5]) # 2. 转换操作链 transformed = rdd.map(lambda x: x*2) \ .filter(lambda x: x>5) \ .flatMap(lambda x: [x, x+1]) # 3. 动作触发计算 result = transformed.collect() # 输出:[6,7,8,9,10,11] ``` 理解RDD操作机制是掌握Spark编程的核心,合理组合转换与动作操作可高效处理大规模数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值