- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个分布在 3 个节点上的系统,并且我的数据分布在这些节点之间。例如,我有一个 test.csv 文件,该文件存在于所有 3 个节点上,并且包含 2 列:
**row | id, c.**
---------------
row1 | k1 , c1
row2 | k1 , c2
row3 | k1 , c3
row4 | k2 , c4
row5 | k2 , c5
row6 | k2 , c6
row7 | k3 , c7
row8 | k3 , c8
row9 | k3 , c9
row10 | k4 , c10
row11 | k4 , c11
row12 | k4 , c12
然后我使用 SparkContext.textFile 将文件读取为 rdd 等。据我了解,每个 Spark 工作节点都会从文件中读取一部分。现在假设每个节点将存储:
我的问题是,假设我想对这些数据进行计算,并且有一个步骤我需要将键分组在一起,因此键值对将是 [k1 [{k1 c1} { k1 c2} {k1 c3}]]..
等等。
有一个函数叫做groupByKey()
,使用起来非常昂贵,推荐使用aggregateByKey()
。所以我想知道 groupByKey()
和 aggregateByKey()
在幕后是如何工作的?有人可以用我上面提供的例子来解释一下吗?打乱后,行驻留在每个节点上的什么位置?
最佳答案
aggregateByKey()与reduceByKey有很大不同。所发生的情况是,reduceByKey 是aggregateByKey 的一种特殊情况。
aggregateByKey() 将组合特定键的值,这种组合的结果可以是您指定的任何对象。您必须指定如何在一个分区(在同一节点中执行)内组合(“添加”)值以及如何组合来自不同分区(可能位于不同节点中)的结果。 reduceByKey 是一种特殊情况,因为组合的结果(例如求和)与值的类型相同,并且从不同分区组合时的操作也与组合内部值时的操作相同。分区。
一个例子:想象一下你有一个配对列表。您将其并行化:
val pairs = sc.parallelize(Array(("a", 3), ("a", 1), ("b", 7), ("a", 5)))
现在您想通过按键“组合”它们以产生总和。在这种情况下,reduceByKey 和aggregateByKey 是相同的:
val resReduce = pairs.reduceByKey(_ + _) //the same operation for everything
resReduce.collect
res3: Array[(String, Int)] = Array((b,7), (a,9))
//0 is initial value, _+_ inside partition, _+_ between partitions
val resAgg = pairs.aggregateByKey(0)(_+_,_+_)
resAgg.collect
res4: Array[(String, Int)] = Array((b,7), (a,9))
现在,假设您希望聚合是一组值,这是与整数不同的类型(整数之和也是整数):
import scala.collection.mutable.HashSet
//the initial value is a void Set. Adding an element to a set is the first
//_+_ Join two sets is the _++_
val sets = pairs.aggregateByKey(new HashSet[Int])(_+_, _++_)
sets.collect
res5: Array[(String, scala.collection.mutable.HashSet[Int])] =Array((b,Set(7)), (a,Set(1, 5, 3)))
关于apache-spark - Spark聚合函数——aggregateByKey是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24804619/
我是 Scala 和 Spark 的新手,所以我希望有人能解释为什么当它在抽象类中时,aggregateByKey 无法编译。这是我能想到的最简单的例子: import org.apache.spar
我遇到过以下 scala 示例,它解释了aggregateByKey。斯卡拉示例: val pairs=sc.parallelize(Array(("a",3),("a",1),("b",7),("a
我是 Apache spark 的新手,所以这个问题可能不好问,但我不知道 combinebykey 和 aggregatebykey 之间的区别以及何时使用哪个操作。 最佳答案 aggregateB
谁能解释一下reducebykey、groupbykey、aggregatebykey和combinebykey之间的区别吗?我已阅读有关此内容的文档,但无法理解确切的差异。 带有示例的解释会很棒。
这个问题在这里已经有了答案: How createCombiner,mergeValue, mergeCombiner works in CombineByKey in Spark ( Using
这三个 Apache Spark 转换有点令人困惑。有什么方法可以确定何时使用哪个以及何时避免使用哪个? 最佳答案 我认为official guide解释得很好。 我将突出显示差异(你有 (K, V)
Apache Spark pyspark.RDD API 文档提到 groupByKey()效率低下。相反,建议使用 reduceByKey() , aggregateByKey() , combin
我是一名优秀的程序员,十分优秀!