Apache spark 火花窄变换能产生重洗牌吗?

Apache spark 火花窄变换能产生重洗牌吗?,apache-spark,Apache Spark,我知道在Sparkmap()中是一个狭窄的转换,因此不需要洗牌。但是如果map()可以更改键,那么在映射完成后,数据可能需要重新洗牌,即不再是一对一分区。那么,为什么它被认为是狭隘的转型呢?谢谢。spark中的映射函数是窄变换,它肯定不会导致洗牌。但是,如果您更改了键,并且有其他依赖于它的操作,它们可能会导致洗牌 例如: 数据由key1分区,并且您正在对数据执行映射并更改key1字段中的值,这将不会导致混乱 执行的下一个操作是group by,它再次使用key1字段,这里将发生洗牌,并且此洗牌的

我知道在Spark
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个分区,对吗?所以这不是真正的重新洗牌?