我在理解 spark LBFGS treeAggregate 转换时遇到了一些问题

I've got some problems on understanding spark LBFGS treeAggregate transformation

最近在我的项目中尝试使用spark LBFGS方法,但是当我阅读源代码时,我确实遇到了一个大问题,代码如下: the code I don't understand 这是源代码 link:https://github.com/apache/spark/blob/v1.6.0/mllib/src/main/scala/org/apache/spark/mllib/optimization/LBFGS.scala

我的问题是:如果我的输入数据(标签,特征)只包含标签和特征向量,treeAggregate seqOp 如何匹配{ case ((grad, loss), (label, features)}?我想只能匹配{case(label, features)}。

其实,我也不太懂"treeAggregate",谁能帮帮我?

我认为你真的不理解treeAggregate operation

在你的post图片中,我给你一个thorough description关于你的问题。

看完之后你就会明白为什么源码可以正确匹配东西了!

如果您觉得 treeAggregate 令人困惑,您可以先了解它的简单但相似的版本 - aggregate.

聚合原型为:

def aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)(implicit arg0: ClassTag[U]): U

好像复杂,对吧?让我为您澄清一下:

RDD 为许多分区中物理分布的数据提供抽象,那么我们如何聚合一个特定键的值

显然有两种情况:

  1. 在同一分区中合并一个值

  2. 跨不同分区合并数据.


seqOp: (U, V) ⇒ U

这就是操作如何在一个分区结果中合并值

combOp: (U, U) ⇒ U

这是跨分区合并操作!

我猜你对reduce操作很熟悉。

事实上,aggregate操作比reduce操作更通用。

为什么 aggregate 存在是因为有时 我们需要 "reduce" 唯一键的值,但想要获得与父项不同类型的结果rdd.

例如,如果我们想在父 rdd 中查找一个特定的键,它有多少个唯一值怎么办?

这个"reduce"操作的值类型明显不同于父rdd。

val pairs = sc.parallelize(Array(("a", 3), ("a", 1), ("b", 7), ("a", 5)))
val sets = pairs.aggregateByKey(new HashSet[Int])(_+_, _++_)
sets.collect
res0: Array[(String, scala.collection.mutable.HashSet[Int])]  =Array((b,Set(7)), (a,Set(1, 5, 3))

示例是关于aggregateByKey,但对于aggregate是可以理解的,只是使用整个数据聚合,而不是关于不同的键。

就这些了.