RDD—Transformation算子

Spark核心编程(Spark Core)

1. 了解RDD

1.1 RDD概念

背景

首先分布式计算

  • 分区控制
  • Shuffle控制
  • 数据存储\序列化\发送
  • 数据计算API
  • 等一系列功能

这些功能, 不能简单的通过Python内置的本地集合对象(如 List\ 字典等)去完成. 我们在分布式框架中, 需要有一个统一的数据抽象对象, 来实现上述分布式计算所需功能. 这个抽象对象, 就是RDD(Resilient Distributed Databases)

RDD定义

RDD定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集

是Spark中最基本的数据抽象,代表一个不可变、可 分区、里面的元素可并行计算的集合。

  • Dataset:一个数据集合,用于存放数据的。 (这个概念 就是 类似于 List Array 之类的)
  • Distributed:RDD中的数据是分布式存储的,可用于分布式计算。 (RDD的数据跨机器存储(跨进程))
  • Resilient:RDD中的数据可以存储在内存中或者磁盘中

1.2 RDD五大特性

  1. RDD有分区

  2. 计算方法作用到每一个分区

  3. RDD之间相互依赖

  4. KV型RDD可以有分区器(可选)

  5. RDD分区数据的读取会尽量靠近数据所在地(可选)

  6. RDD是有分区的

    RDD的分区是RDD数据存储的最小单位(一份RDD数据本质上是分隔成多个分区)
    在这里插入图片描述

  7. RDD的方法会作用在其所有分区上
    在这里插入图片描述

  8. RDD之间是有依赖关系的

在这里插入图片描述

  1. Key-Value 型的RDD可以有分区

    KV型RDD数据:RDD内存储的数据是:二元元组
    在这里插入图片描述

  2. RDD的分区规划 会尽量靠近数据所在的服务器

在这里插入图片描述

1.3 WordCount案例分析

在这里插入图片描述

2 RDD编程入门

Spark RDD 编程的程序入口对象是SparkContext对象(不论何种编程语言)

只有构建出SparkContext, 基于它才能执行后续的API调用和计算

本质上, SparkContext对编程来说, 主要功能就是创建第一个RDD出来

2.1 RDD的创建

两种方式:

  1. 并行化集合方式创建(本地化对象 转 分布式RDD)
  2. 读取外部数据源(读取文件)

并行化集合方式创建

# 0. 创建Spark执行环境
from pyspark import SparkConf,SparkContext

#配置对象
conf = SparkConf().setAppName("test").setMaster("local[*]")
#入口对象
sc = SparkContext(conf=conf)

# master种类
# local:loacal[N] N核CPU运行  *所有CPU核心
# standalone
# yarn


#sc对象的parallelize 方法:将本地集合转换成RDD返回
data = [1,2,3,4,5,6,7,8,9]
rdd = sc.parallelize(data,numSlices=3)# 设置分区
print("默认分区数:",rdd.getNumPartitions())
# collect : 将RDD(分布式对象)中每个分区的数据都发送到Driver 中 形成一个 Python List
# collect: 分布式 -> 本地集合
print(rdd.collect())

读取外部数据源

  1. textFile() 既可以读取本地文件也可HDFS文件

在这里插入图片描述

#coding:utf-8

from pyspark import SparkConf,SparkContext
from pathlib import Path

FILE = Path(__file__).resolve()# /tmp/pycharm_project_362/00_example/HelloWorld.py
ROOT = FILE.parents[1]# /tmp/pycharm_project_362

if __name__ == '__main__':
    conf = SparkConf().setAppName("test").setMaster("local[*]")
    sc = SparkContext(conf=conf)

    ## 读取文本文件
    filerdd1 = sc.textFile(f"file:///{
     
     ROOT}/data/input/words.txt")
    print("默认分区:",filerdd1.getNumPartitions())
    print("file_rdd1:",filerdd1.collect())

    filerdd2 = sc.textFile(f"file:///{
     
     ROOT}/data/input/words.txt",minPartitions=3)
    # 指定最小分区只是参考值 Spark 有自己的判断
    filerdd3 = sc.textFile(f"file:///{
     
     ROOT}/data/input/words.txt", minPartitions=100)
    print("最小分区:", filerdd2.getNumPartitions())
    print("filerdd3分区:", filerdd3.getNumPartitions())
    print("file_rdd2:", filerdd2.collect())

    ##读取HDFS
    hdfs_rdd = sc.textFile('hdfs://hadoop102:8020/wcinput/word.txt')
    print(hdfs_rdd.collect())
  1. wholeTextFile()

在这里插入图片描述

import os

from pyspark import SparkConf,SparkContext
from pathlib import Path

FILE = Path(__file__).resolve()# /tmp/pycharm_project_362/00_example/HelloWorld.py
ROOT = FILE.parents[1]# /tmp/pycharm_project_362

if __name__ == '__main__':

    conf = SparkConf().setAppName("test").setMaster("local[*]")
    sc = SparkContext(conf=conf)

    # 这样也可成功  但都需要绝对路径
    # rdd = sc.wholeTextFiles("file:///"+os.path.abspath("../data/input/tiny_files"))
    rdd = sc.wholeTextFiles(f"file:///{
     
     ROOT}/data/input/tiny_files")
    print(rdd
<think>我们正在讨论SparkRDD算子。根据引用[1],RDD的主要特征包括分区、不可变性和并行操作。引用[2]提到了一些常用算子如map、flatMap、filter、distinct、sortBy和reduceByKey。引用[3]则展示了foreach和foreachPartition的用法,并建议使用分区级算子以提高效率。用户需求:了解RDD算子列表及使用方法回答结构:1.简要介绍RDD算子(转化和行动)2.分类列出常用算子,给出定义和示例3.提供使用建议(如引用[3]提到的分区级算子更高效)注意:所有数学表达式和代码块按指令处理。</think>### Spark RDD算子详解 Spark RDD算子分为**转化算子Transformation)**和**行动算子(Action)**两类。转化算子生成新RDD(惰性执行),行动算子触发计算并返回结果。以下是常用算子及用法: --- #### **一、常用转化算子Transformation)** 1. **`map(func)`** - **功能**:对每个元素应用函数,返回新RDD - **示例**:`rdd.map(x => x * 2)` ```scala // 输入: [1,2,3] → 输出: [2,4,6] ``` 2. **`flatMap(func)`** - **功能**:先映射再扁平化(一对多) - **示例**:`rdd.flatMap(x => Array(x, x*10))` ```scala // 输入: [1,2] → 输出: [1,10,2,20] ``` 3. **`filter(func)`** - **功能**:过滤满足条件的元素 - **示例**:`rdd.filter(x => x > 5)` ```scala // 输入: [3,8,6] → 输出: [8,6] ``` 4. **`distinct([numPartitions])`** - **功能**:去重 - **示例**:`rdd.distinct()` ```scala // 输入: [1,3,3,2] → 输出: [1,3,2] ``` 5. **`reduceByKey(func, [numPartitions])`** - **功能**:按Key聚合(需键值对RDD) - **示例**:`pairRdd.reduceByKey(_ + _)` ```scala // 输入: [("a",1),("b",2),("a",3)] → 输出: [("a",4),("b",2)] ``` --- #### **二、常用行动算子(Action)** 1. **`collect()`** - **功能**:返回所有元素到Driver程序 - **示例**:`rdd.collect() // 输出: Array(1,2,3)` 2. **`count()`** - **功能**:统计元素总数 - **示例**:`rdd.count() // 输出: 100` 3. **`foreach(func)`** - **功能**:遍历每个元素(无返回值) - **示例**(引用[3]): ```scala rdd.foreach(x => println(x * 10)) // 每个元素乘10后打印 ``` 4. **`foreachPartition(func)`** - **功能**:遍历每个分区(更高性能,推荐使用[^3]) - **示例**(引用[3]): ```scala rdd.foreachPartition(iter => iter.foreach(x => println(x * 10))) ``` 5. **`take(n)`** - **功能**:返回前n个元素 - **示例**:`rdd.take(3) // 输出: [1,2,3]` --- #### **三、关键优化建议** - **优先选择分区级算子**:如`mapPartitions`、`foreachPartition`比单元素算子(`map`/`foreach`)更高效,减少函数调用开销[^3]。 - **持久化中间结果**:对重复使用的RDD调用`persist()`避免重复计算。 - **控制分区数**:通过`repartition()`或`coalesce()`调整并行度。 > **注**:完整算子列表见[Spark官方文档](https://spark.apache.org/docs/latest/rdd-programming-guide.html#transformations)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值