导致随机播放的 Spark 转换有哪些?

2022-09-01 02:27:43

我在 Spark 文档操作中很难找到导致随机播放的操作,而操作则不会。在此列表中,哪些会导致洗牌,哪些不会导致洗牌?

地图和过滤器不会。但是,我不确定其他人。

map(func)
filter(func)
flatMap(func)
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed)
union(otherDataset)
intersection(otherDataset)
distinct([numTasks]))
groupByKey([numTasks])
reduceByKey(func, [numTasks])
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
sortByKey([ascending], [numTasks])
join(otherDataset, [numTasks])
cogroup(otherDataset, [numTasks])
cartesian(otherDataset)
pipe(command, [envVars])
coalesce(numPartitions)

答案 1

实际上,在没有文档的情况下,很容易找到这一点。对于这些函数中的任何一个,只需创建一个RDD并调用调试字符串,下面是一个示例,您可以自己完成其余的工作。

scala> val a  = sc.parallelize(Array(1,2,3)).distinct
scala> a.toDebugString
MappedRDD[5] at distinct at <console>:12 (1 partitions)
  MapPartitionsRDD[4] at distinct at <console>:12 (1 partitions)
    **ShuffledRDD[3] at distinct at <console>:12 (1 partitions)**
      MapPartitionsRDD[2] at distinct at <console>:12 (1 partitions)
        MappedRDD[1] at distinct at <console>:12 (1 partitions)
          ParallelCollectionRDD[0] at parallelize at <console>:12 (1 partitions)

因此,如您所见,创建了一个随机播放。以这种方式而不是文档来找出答案也特别重要,因为在某些情况下,某个功能将需要或不需要洗牌。例如,联接通常需要洗牌,但如果您加入两个RDD,则来自同一RDD火花的分支有时会消除洗牌。distinct


答案 2

以下是可能导致随机播放的操作列表:

cogroup

groupWith

连接:哈希分区

leftOuterJoin: hash partition

右外加入:哈希分区

组按键: 哈希分区

reduceByKey: hash partition

combineByKey: hash partition

排序按键:范围分区

distinct

交集:哈希分区

repartition

coalesce

来源:使用Spark和Scala进行大数据分析,使用分区优化,Coursera