gpt4 book ai didi

scala - 为什么 Spark reduceByKey 的结果不一致

转载 作者:可可西里 更新时间:2023-11-01 14:20:46 26 4
gpt4 key购买 nike

我正在尝试使用 scala 通过 spark 计算每行的迭代次数。
以下是我的输入:

1 维克拉姆
2 萨钦
3 肖比特
4 好吧
5个阿库尔
5个阿库尔
1 维克拉姆
1 维克拉姆
3 肖比特
10阿树
5个阿库尔
1 维克拉姆
2 萨钦
7 维克拉姆

现在我创建了 2 个独立的 RDD,如下所示。

val f1 = sc.textFile("hdfs:///path to above data file")
val m1 = f1.map( s => (s.split(" ")(0),1) ) //creating a tuple (key,1)
//now if i create a RDD as
val rd1 = m1.reduceByKey((a,b) => a+b )
rd1.collect().foreach(println)
//I get a proper output i.e (it gives correct output every time)
//output: (4,1) (2,2) (7,1) (5,3) (3,2) (1,4) (10,1)

//but if i create a RDD as
val rd2 = m1.reduceByKey((a,b) => a+1 )
rd2.collect().foreach(println)
//I get a inconsistent result i.e some times i get this (WRONG)
//output: (4,1) (2,2) (7,1) (5,2) (3,2) (1,2) (10,1)
//and sometimes I get this as output (CORRECT)
//output: (4,1) (2,2) (7,1) (5,3) (3,2) (1,4) (10,1)

我无法理解为什么会发生这种情况以及在哪里使用什么。我也尝试将 RDD 创建为

val m2 = f1.map(s => (s,1))
val rd3 = m2.reduceByKey((a,b) => a+1 )
// Then also same issue occurs with a+1 but every thing works fine with a+b

最佳答案

reduceByKey 假定传递的函数是可交换的关联的(如docs 明确指出)。并且 - 你的第一个函数 (a, b) => a + b ,但是 (a, b) => a+1 < em>不是。

为什么?一方面 - reduceByKey 将提供的函数应用于每个分区,然后应用于所有分区的组合结果。换句话说,b 并不总是 1,因此使用 a+1 是不正确的。

考虑以下场景 - 输入包含 4 条记录,分成两个分区:

(aa, 1)
(aa, 1)

(aa, 1)
(cc, 1)
此输入的

reduceByKey(f) 可能计算如下:

val intermediate1 = f((aa, 1), (aa, 1)) 
val intermediate2 = f((aa, 1), (cc, 1))

val result = f(intermediate2, intermediate1)

现在,让我们使用 f = (a, b) => a + b

val intermediate1 = f((aa, 1), (aa, 1))       // (aa, 2)
val intermediate2 = f((aa, 1), (cc, 1)) // (aa, 1), (cc, 1)

val result = f(intermediate2, intermediate1) // (aa, 3), (cc, 1)

f = (a, b) => a + 1:

val intermediate1 = f((aa, 1), (bb, 1))       // (aa, 2)
val intermediate2 = f((aa, 1), (cc, 1)) // (aa, 1), (cc, 1)

// this is where it goes wrong:
val result = f(intermediate2, intermediate1) // (aa, 2), (cc, 1)

主要是 - 中间计算的顺序无法保证,并且可能会在执行之间发生变化,对于后一种非交换函数的情况,这意味着结果有时是错误的。

关于scala - 为什么 Spark reduceByKey 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39351147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com