算子分为value-transform, key-value-transform, action三种。f是输入给算子的函数,比如lambda x: x**2
常用算子:
keys: 取pair rdd的key部分
values: 取pair rdd的value部分
map: f作用于每个元素
flatMap: f作用于每个元素、输出list,然后对list压平
mapValues: f作用于pair rdd的value部分
flatMapValues: f作用于pair rdd的value部分,然后对list压平(即将list各元素分发配对到对应的key后)
mapPartitions: f作用于每个part,输入是iterator
mapParttitionsWithIndex: f作用于每个part,输入是(index,iterator)
glom: 将元素汇集成list
groupBy: f作用于每个元素并构造key,相同key的元素聚合成value_list
groupByKey: pair rdd的相同key的元素shuffle后,value部分聚合成value_list
repartition: 设定每个rdd的part个数,包含shuffle操作(即汇集有相同key的pair),操作前后会改变并行度
coalesce: 设定并降低part数量,不做shuffle操作
repartitionAndSortWithinPartitions: 设定每个rdd的part个数,目标part中按照key部分排序
sortByKey: 对pair rdd的所有元素shuffle后按key部分排序
cogroup: 两个pair rdd shuffle后相同key的元素聚合成value_iterator_list
reduce: f遍历元素list,须满足交换律和结合律
reduceByKey: pair rdd shuffle后相同key的元素聚合成value_list,f遍历value_list
filter: f作用于每个元素输出bool值,满足条件的元素会保留
collect: 汇集所有的元素
take:取数据集前n个元素
union: 合并两个rdd的元素集合(不去重)
intersection: 两个rdd的元素集合取交集
join: pair rdd shuffle后相同key的value部分inner join,即(k, v1) join (k, v2) -> (k, (v1, v2))
distinct: 遍历元素list去重
subtract: 两个rdd的元素集合取差集
count: 计数元素个数
countByKey: 计数有相同key的value的个数,返回hashmap结构
saveAsTextFile: rdd转化为文本文件并保存
foreach: f作用于每个元素,常用于print
broadcast: 将变量分发/广播到各个任务上,书写".value"取其值
经验:
broadcast变量时妥善使用数据结构,比如set类型查找很快。相对于用list任务运行快很多。
spark-submit参数用--files s3://path/to/file可分发s3文件到计算节点当前目录
参考资料:
spark sql: