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优化
7. 核心补充操作
(1) 去重操作
rdd = sc.parallelize([1,3,3,5,5]) distinct_rdd = rdd.distinct() # [1,3,5]
(2) 采样操作
随机采样10%数据,带随机种子 sampled = rdd.sample(withReplacement=False, fraction=0.1, seed=42)
(3) 聚合操作
计算总和 rdd.reduce(lambda a,b: a+b) # 行动操作,返回结果 使用fold(需提供零值) rdd.fold(0, lambda a,b: a+b)
关键实践建议
-
惰性执行机制:所有转换操作(map/filter等)均为惰性,直到遇到行动操作(如
collect())才执行 -
持久化策略:对复用RDD使用
persist()缓存rdd = sc.textFile(...).map(...).filter(...) rdd.persist(StorageLevel.MEMORY_AND_DISK) # 内存不足时溢写到磁盘
-
避免
collect():大数据集用take(N)替代,防止Driver内存溢出 -
分区管理:
-
使用
repartition()调整分区数(触发shuffle) -
coalesce()合并分区(无shuffle)
-
1261

被折叠的 条评论
为什么被折叠?



