Apache spark 火花窄变换能产生重洗牌吗?
我知道在SparkApache spark 火花窄变换能产生重洗牌吗?,apache-spark,Apache Spark,我知道在Sparkmap()中是一个狭窄的转换,因此不需要洗牌。但是如果map()可以更改键,那么在映射完成后,数据可能需要重新洗牌,即不再是一对一分区。那么,为什么它被认为是狭隘的转型呢?谢谢。spark中的映射函数是窄变换,它肯定不会导致洗牌。但是,如果您更改了键,并且有其他依赖于它的操作,它们可能会导致洗牌 例如: 数据由key1分区,并且您正在对数据执行映射并更改key1字段中的值,这将不会导致混乱 执行的下一个操作是group by,它再次使用key1字段,这里将发生洗牌,并且此洗牌的
map()
中是一个狭窄的转换,因此不需要洗牌。但是如果map()
可以更改键,那么在映射完成后,数据可能需要重新洗牌,即不再是一对一分区。那么,为什么它被认为是狭隘的转型呢?谢谢。spark中的映射函数是窄变换,它肯定不会导致洗牌。但是,如果您更改了键,并且有其他依赖于它的操作,它们可能会导致洗牌
例如:
数据由key1分区,并且您正在对数据执行映射并更改key1字段中的值,这将不会导致混乱
执行的下一个操作是group by,它再次使用key1字段,这里将发生洗牌,并且此洗牌的大小取决于您如何在上面的映射函数中更改key1
<>如果你只考虑地图函数,它不会造成任何拖曳。但它将影响随后的其余操作。Spark
窄转换
不会导致数据的洗牌
如果我们举个例子
map(func)
filter(func)
flatMap(func)
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed)
union(otherDataset)
intersection(otherDataset)
distinct([numTasks]))
描述代码
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)
scala>vala=sc.parallelize(数组(1,2,3)).distinct
scala>a.toDebugString
MappedRDD[5]位于不同的位置:12(1个分区)
MapPartitionsRDD[4]位于不同的位置:12(1个分区)
**12(1个分区)处不同位置的Shuffledd[3]**
MapPartitionsRDD[2]位于不同的位置:12(1个分区)
MappedRDD[1]位于不同的位置:12(1个分区)
ParallelCollectionRDD[0]位于parallelize位于:12(1个分区)
如果您将在这里看到的话,那么只有大范围的转换导致了数据的混乱。
但这种狭隘的转换不会成为数据混乱的原因
下面是来自的快照
虽然它可能会弄乱键,map()
本身是本地操作,不涉及洗牌。您可以执行一个map()
,将键弄乱,然后执行另一个map()
,以及另一个map()
。。。所有这些都不需要在分区周围洗牌数据,这就是为什么它被认为是狭窄的。谢谢。我在你们的例子中看到的是collect()重新洗牌了数据,但结果是直到1个分区,对吗?所以这不是真正的重新洗牌?