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
优化