【问题标题】:I've got some problems on understanding spark LBFGS treeAggregate transformation我在理解 spark LBFGS treeAggregate 转换方面遇到了一些问题
【发布时间】:2017-08-30 10:35:56
【问题描述】:

我最近在我的项目中尝试使用spark LBFGS方法,但是当我阅读源代码时,我真的遇到了一个大问题,代码如下: the code I don't understand 这里是源代码链接: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”,有人可以帮助我吗?

【问题讨论】:

标签: scala apache-spark apache-spark-mllib non-linear-regression


【解决方案1】:

我认为你还没有真的了解treeAggregate operation

在你发布的图片中,让我给你一个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 存在的原因是有时我们需要“减少”唯一键的值,但希望获得与父 rdd 中不同类型的结果。。 p>

例如,如果我们想在父 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是可以理解的,只是使用整个数据聚合,而不是不同的key。

就是这样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2019-10-21
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多