针对两个pair RDD的连接转化操作 (rdd = {(1,2),(3,4),(3,6)} other = {(3,9)})
rdd.subtractByKey(other) #删掉rdd中与other rdd 中的键相同的元素 {(1,2)}
rdd.join(other) #对两个rdd内连接 {(3,(4,9)),(3,(6,9))}
rdd.leftOuterJoin(other) #左连接 {(1,(2,None)),(3,(4,9)),(3,(6,9))}
rdd.rightOuterJoin(other) #右连接 {(3,(4,9)),(3,(6,9))}
Pair RDD的行动操作,以键值对集合{(1,2),(3,4),(3,6)} 为例
rdd.countByKey() #对每个键对应的元素进行统计{(1,1),(3,2)}
rdd.collectAsMap() #将结果以映射表的形式返回 Map{(1,2),(3,6)}
lookup(key) #返回给定的键对应的所有值 rdd.lookup(3) {(3,4),(3,6)}
举例1:单词计数
rdd = sc.textFile("xxx.txt")
words = rdd.flatMap(lambda x:x.split())
result = words.map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y)
举例2:求每个键的平均值
sumCount = nums.combineByKey((lambda x:(x,1)),(lambda x,y:(x[0]+y,x[1]+1)),(lambda x,y:(x[0]+y[0],x[1]+y[1])))
sumCount.map(lambda x,y:(x,y[0]/y[1])).collectAsMap()
并行度优化和数据分组:
每个RDD都有固定数目的分区,分区数决定了在RDD上被执行操作时的并行度,在执行聚合或分组操作时,可以要求spark使用给定的分区数。
spark始终尝试根据集群的大小推断出一个有意义的默认值,但是有时候可能要对并行度进行调优来获取更好的性能表现
sc.parallelize(data).reduceByKey(lambda x,y:x+y) #默认并行度
sc.parallelize(data).reduceByKey(lambda x,y:x+y,10) #自定义并行度
分组:groupByKey() 会使用RDD中的键来对数据进行分组,也可以根据除键相同以外的条件进行分组,它可以接受一个函数,对源rdd中的每个元素使用该函数,将返回结果作为键值再进行分组。