scala – 如何解释RDD.treeAggregate
我在Apache Spark代码源中遇到了
this line
val (gradientSum,lossSum,miniBatchSize) = data .sample(false,miniBatchFraction,42 + i) .treeAggregate((BDV.zeros[Double](n),0.0,0L))( seqOp = (c,v) => { // c: (grad,loss,count),v: (label,features) val l = gradient.compute(v._2,v._1,bcWeights.value,Vectors.fromBreeze(c._1)) (c._1,c._2 + l,c._3 + 1) },combOp = (c1,c2) => { // c: (grad,count) (c1._1 += c2._1,c1._2 + c2._2,c1._3 + c2._3) } ) 我读这个有多个麻烦: >首先,我在网上找不到任何解释treeAggregate如何工作的内容,params的含义是什么. 这个陈述必须非常先进.我无法开始破译这一点. 解决方法
treeAggregate是聚合的专用实现,它将组合函数迭代地应用于分区的子集.这样做是为了防止将所有部分结果返回给驱动程序,其中单个传递减少将像经典聚合那样发生.
出于所有实际目的,treeAggregate遵循与在此答案中解释的聚合相同的原理:Explain the aggregate functionality in Python,除了它需要额外的参数来指示部分聚合级别的深度. 让我试着解释一下这里发生了什么: 对于聚合,我们需要零,组合器函数和reduce函数. 然后我们可以像这样剖析上面的函数.希望这有助于理解: val Zero: (BDV,Double,Long) = (BDV.zeros[Double](n),0L) val combinerFunction: ((BDV,Long),(??,??)) => (BDV,Long) = (c,c._3 + 1) val reducerFunction: ((BDV,(BDV,Long)) => (BDV,Long) = (c1,c1._3 + c2._3) } 然后我们可以以更易于消化的形式重写对treeAggregate的调用: val (gradientSum,miniBatchSize) = treeAggregate(Zero)(combinerFunction,reducerFunction) 此表单将“生成”结果元组到命名值gradientSum,miniBatchSize以供进一步使用. 请注意,treeAggregate接受一个额外的参数 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 一步一步弄懂angularJS基础
- Be Angular | Bootstrap Admin Web App with AngularJS
- 多次使用axis2调用webservice后,报连接超时错误
- bash – 从Windows桌面的cygwin ssh快捷方式
- WebService的事务处理
- unix – 用于将数字转换为电话格式的Bourne shell脚本
- angularjs – 表情符号支持textarea或contenteditable div
- AngularJS – 如何以编程方式创建一个新的,隔离的范围?
- WebService(注解),CXF框架(jax-ws,Jax-rs,与spring整合)
- HDU—1166—敌兵布阵—【数据结构】【线段树】【单点更新】