2014-10-09 67 views
24

我無法在Spark文檔操作中找到導致洗牌和操作的操作。在這個列表中,哪些會導致洗牌,哪些不會呢?導致洗牌的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) 

回答

29

這實際上是非常容易找到這一點,沒有文檔。對於這些函數中的任何一個,只需創建一個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) 

因此,您可以看到distinct創建洗牌。找出這種方式而不是文檔也是特別重要的,因爲在某些情況下需要或不需要洗牌。例如,連接通常需要洗牌,但是如果您加入兩個RDD,那麼來自相同RDD火花的分支有時會忽略洗牌。

+6

這只是關於編程一般好點的實際 - 通過閱讀代碼,並使用代碼在閱讀文檔,回答問題。文檔通常可能包含信息的重複,並且重複會帶來錯誤和信息丟失。在閱讀代碼時,人們可以知道*究竟*發生了什麼:) – samthebest 2014-12-07 10:34:04

+0

根據文檔,'toDebugString'返回「此RDD的描述及其用於調試的遞歸依賴關係。」因此,如果它們存在,即使最近的轉型沒有發生洗牌,它也將包括可能的來自先前轉型的洗牌,對吧? – 2018-03-01 05:10:59

0

這裏是洗牌變換廣義聲明。

轉換這可能導致洗牌包括再分配操作 像repartition和​​3210,「ByKey操作(除了計數) 像groupByKeyreduceByKey,和加入操作,如cogroupjoin

source