记录一些基本的Spark中的Transformation,由于课程要求使用Python,因此所有API都以PySpark为准。
Basic Transformations Tips
combineByKey()
combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=)
将一个RDD([K, V])变为RDD([K, C])
这里用 K 表示 Key,V 表示 Values ,C 表示组合结果(combine type),combineByKey()实际上是其他 *ByKey Transformation的基础
用户需要提供3个函数(Functions):
- createCombiner,该函数将一个V变为一个C(即创建一个只有一个元素的列表)
- mergeValue,该函数将一个V合并入一个C(即将元素添加入列表,这项操作在一个Partition内进行)
- mergeCombiners,该函数将两个C变为一个(即合并列表,该操作跨Partition进行)
其实这三个函数的作用很好理解,我们用一个例子来看,该例子是为了计算每个字母的值的总和以及计次
从上述的例子中,我们可以这么理解,实际上createCombiner就是决定在第一次遇见某个键值对(Key-vlue pair)时该怎么处理;mergeValue 就是再次遇见某个键值对(Key-vlue pair)时该怎么处理。
在这个例子中,我们有有几点需要注意一下:
- 因为在partition 1和2中都有键(key)为 ‘B’ 的键值对,所以在这两个partitions中,我们都要对 <‘B’, * > 进行一次createCombiner
- 注意collect,collect就是一个Action,整个流程直到collect被调用,才会被执行 (The whole procedure will not be excuted until collect be called)
reduceByKey()
reduceByKey(func, numPartitions=None, partitionFunc=)
使用用户定义的Function合并每个键(key)的值。
事实上,reduceByKey() 就是通过 combineByKey() 实现的,这也是我们之前说后者是所有 *ByKey 操作基础的原因
groupByKey()
groupByKey(numPartitions=None, partitionFunc=)
将RDD中每个键(key)的值分为单独一组。
在实际情况中,我们尽量避免使用 groupByKey() 。因为它不会在每个partition中将同键(key)的键值对进行合并,而reduceByKey() 会在每个partition内就进行合并。
用两张图就能直观对比