我在理解 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 为许多分区中物理分布的数据提供抽象,那么我们如何聚合一个特定键的值?
显然有两种情况:
在同一分区中合并一个值。
跨不同分区合并数据.
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是可以理解的,只是使用整个数据聚合,而不是关于不同的键。
就这些了.
最近在我的项目中尝试使用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 为许多分区中物理分布的数据提供抽象,那么我们如何聚合一个特定键的值?
显然有两种情况:
在同一分区中合并一个值。
跨不同分区合并数据.
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是可以理解的,只是使用整个数据聚合,而不是关于不同的键。
就这些了.