Apache spark t火花中的减压阀与减压阀
我看到下面的帖子有点回溯: 我仍在努力准确地理解何时使用treeReduce和reduceByKey。我想我们可以使用一个通用的例子,比如单词计数,来帮助我进一步了解正在发生的事情Apache spark t火花中的减压阀与减压阀,apache-spark,Apache Spark,我看到下面的帖子有点回溯: 我仍在努力准确地理解何时使用treeReduce和reduceByKey。我想我们可以使用一个通用的例子,比如单词计数,来帮助我进一步了解正在发生的事情 在字数统计中使用reduceByKey总是有意义的吗 或者当treeReduce更有意义时,是否存在特定大小的数据 当treeReduce是更好的选择时,是否有特定的案例或规则 同样,这也可以在上面基于reduceByKey得到回答,但是reduceByKey局部和treeReduce是否有任何变化 如何正确确定深
- 在字数统计中使用reduceByKey总是有意义的吗
- 或者当treeReduce更有意义时,是否存在特定大小的数据
- 当treeReduce是更好的选择时,是否有特定的案例或规则李>
- 同样,这也可以在上面基于reduceByKey得到回答,但是reduceByKey局部和treeReduce是否有任何变化
- 如何正确确定深度
res2: Array[(String, Int)] = Array((D,1), (18964,1), (D,1), (1,1), ("",1), ("",1), ("",1), ("",1), ("",1), (1,1))
scala> val reduce = input.reduceByKey(_+_)
reduce: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[11] at reduceByKey at <console>:25
scala> val tree = input.treeReduce(_+_, 2)
<console>:25: error: type mismatch;
found : (String, Int)
required: String
val tree = input.treeReduce(_+_, 2)
res2:Array[(String,Int)]=数组((D,1)、(18964,1)、(D,1)、(1,1),(“”,1),(“”,1),(“”,1),(“”,1),(“”,1),(“”,1),(“”,1,1))
scala>val reduce=input.reduceByKey(+389;)
reduce:org.apache.spark.rdd.rdd[(String,Int)]=ShuffledRDD[11]位于reduceByKey:25
scala>val tree=input.treeReduce(+2)
:25:错误:类型不匹配;
找到:(字符串,Int)
必需:字符串
val tree=input.TREEREDUCT(+2)
这两种方法之间存在根本区别-reduceByKey
仅适用于键值对RDD,而treeReduce
是任何RDD上reduce
操作的推广reduceByKey
用于实现treeReduce
,但它们在任何其他意义上都不相关
reduceByKey
对每个键执行还原,生成RDD;它不是RDD意义上的“动作”,而是返回ShufferDD的转换。这相当于groupByKey
后面跟着一个执行按键缩减的map
(检查为什么使用groupByKey
效率低下)
另一方面,treeaggreegate
是reduce
函数的推广,灵感来自AllReduce
。这是spark意义上的“动作”,在主节点上返回结果。正如您问题中的链接所解释的,在执行本地reduce操作后,reduce
在主机上执行其余的计算,这可能非常繁重(特别是在机器学习中,当reduce函数生成大向量或矩阵时)。相反,treeReduce
使用reduceByKey
并行执行缩减(这是通过动态创建键值对RDD来完成的,键值对由树的深度决定;检查实现)
因此,为了回答前两个问题,您必须使用reduceByKey
进行字数计算,因为您感兴趣的是获得每个字数,而treeReduce
在这里并不合适。另外两个问题与本主题无关