Spark RDD的创建与常用转换

1. 从集合创建RDD

 从列表/元组创建RDD
data_list = [1, 2, 3, 4, 5]
data_tuple = (6, 7, 8, 9)

rdd_list = sc.parallelize(data_list)
rdd_tuple = sc.parallelize(data_tuple)  # 元组会被自动解包为列表

 分区数设置原则
rdd = sc.parallelize(data_list, numSlices=4)  # 显式指定4个分区
print("分区数:", rdd.getNumPartitions())  # 输出: 4

关键补充:

  • 分区优化:分区数建议设为集群CPU核心数的2-4倍,避免过多分区导致调度开销

  • 数据分布parallelize()默认使用哈希分区,大集合需确保数据均匀分布

  • 内存警告:仅适合小型数据集(GB级以下),大数据集应从外部存储读取


2. 从文本文件创建RDD

 本地文件系统 (file:// 可省略)
rdd_local = sc.textFile("file:///data/logs.txt")  # 显式协议
rdd_local2 = sc.textFile("/data/logs.txt")       # 隐式本地路径

 HDFS文件
rdd_hdfs = sc.textFile("hdfs://namenode:8020/data/mydata.csv")

 通配符与压缩文件
rdd_multi = sc.textFile("/data/logs/*.gz")  # 读取所有gz压缩文本

关键补充:

  • 最小分区数textFile(path, minPartitions=N)可控制初始分区

  • 二进制文件:使用sc.binaryFiles()读取二进制格式(如图片)

  • HDFS最佳实践:优先使用HDFS路径,避免file://在集群模式失效


3. map操作详解

 数值转换
rdd = sc.parallelize([1, 2, 3])
squared_rdd = rdd.map(lambda x: x**2)  # [1, 4, 9]

 结构化数据处理
logs = ["ERROR: Disk full", "INFO: Task completed"]
log_rdd = sc.parallelize(logs)
level_rdd = log_rdd.map(lambda s: s.split(":")[0])  # ["ERROR", "INFO"]

 返回复杂结构
def parse_log(line):
    parts = line.split(":")
    return {"level": parts[0], "message": parts[1].strip()}

parsed_rdd = log_rdd.map(parse_log)  # 生成字典RDD

4. flatMap vs map 核心区别

 场景:拆分句子为单词
sentences = ["Hello world", "Spark is fast"]

 map 返回嵌套列表
map_result = sentences.map(lambda s: s.split())  # [["Hello","world"], ["Spark","is","fast"]]

 flatMap 展平为单列表
flatmap_result = sentences.flatMap(lambda s: s.split())  # ["Hello","world","Spark","is","fast"]

使用场景:

  • 需保留原始结构 → map

  • 需合并所有子结果 → flatMap(如分词、展开嵌套JSON)


5. filter高级用法

 组合条件过滤
numbers = sc.parallelize(range(1, 11))
filtered = numbers.filter(lambda x: x % 2 == 0 and x > 5)  # [6,8,10]

 过滤空值
data = ["A", "", None, "B"]
clean_rdd = data.filter(lambda x: x is not None and len(x) > 0)  # ["A","B"]

6. sortBy深度解析

 多级排序 (先年级降序, 再年龄升序)
students = [("Zhang", 20, "2020"), ("Li", 19, "2020"), ("Wang", 22, "2019")]
rdd = sc.parallelize(students)

 返回排序键元组实现多级排序
sorted_rdd = rdd.sortBy(lambda x: (-int(x[2]), x[1])) 

 结果: [('Li',19,'2020'), ('Zhang',20,'2020'), ('Wang',22,'2019')]

性能注意:

  • 全局排序会触发shuffle,大数据集需谨慎

  • 可先repartitionAndSortWithinPartitions优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值