当前位置: 首页 > 知识库问答 >
问题:

用reduceByKey()替换groupByKey()

王子明
2023-03-14

这是这里的后续问题。我正试图在这个实现的基础上实现k-means。它工作得很好,但我想用reduceByKey()替换groupByKey(),但我不确定如何替换(我现在不担心性能)。以下是相关的简化代码

val data = sc.textFile("dense.txt").map(
        t => (t.split("#")(0), parseVector(t.split("#")(1)))).cache()

val read_mean_centroids = sc.textFile("centroids.txt").map(
        t => (t.split("#")(0), parseVector(t.split("#")(1))))
var centroids = read_mean_centroids.takeSample(false, K, 42).map(x => x._2)
do {
    var closest = read_mean_centroids.map(p => (closestPoint(p._2, centroids), p._2))
    var pointsGroup = closest.groupByKey() // <-- THE VICTIM :)
    var newCentroids = pointsGroup.mapValues(ps => average(ps.toSeq)).collectAsMap()
    ..

请注意,println(newCentroids)将给出:

地图(23)-

println(最接近的)

在地图kmeans.scala:75

相关问题:在ApacheSpark(Scala)中使用reduceByKey。

一些文件:

DEF还原ByKey(func:(V, V)0020 V): RDD[(K, V)]

使用关联减少函数合并每个关键点的值。

DEF减少ByKey(func:(V, V)0020 V, Num分区: Int): RDD[(K, V)]

使用关联减少函数合并每个关键点的值。

def reduceByKey(partitioner:partitioner,func:(V,V)⇒ 五) :RDD[(K,V)]

使用关联减少函数合并每个关键点的值。

def groupByKey():RDD[(K,Iterable[V])]

将RDD中每个键的值分组为单个序列。

共有1个答案

燕砚文
2023-03-14

你可以像这样使用一个aggregateByKey()(比reduceebykey()自然一点)来计算新的质心

val newCentroids = closest.aggregateByKey((Vector.zeros(dim), 0L))(
  (agg, v) => (agg._1 += v, agg._2 + 1L),
  (agg1, agg2) => (agg1._1 += agg2._1, agg1._2 + agg2._2)
).mapValues(agg => agg._1/agg._2).collectAsMap 

为此,您需要计算数据的维度,即dim,但只需计算一次。您可能会使用类似于val dim=data的东西。首先_2.长度

 类似资料:
  • 你好,我经常需要在代码中使用,但我知道这是一个非常繁重的操作。由于我正在努力提高性能,我想知道删除所有调用的方法是否有效。 我使用的是,但是由于这种方法对于大型数据集可能会有很大的问题,所以我想使用这个解决方案: 我所做的不是创建类型对(Int,Int)的RDD,而是创建类型对(Int,list[Int]),所以我的如下所示 你认为有没有更快的方法来达到同样的结果,使用一些其他的方法?谢谢你。

  • 我使用的是Spark 1.5/1.6,我想在DataFrame中执行reduceByKey操作,我不想将df转换为rdd。 每行看起来像,我有多行id1。 我想有这样的东西: 所以,对于每个“id1”,我希望所有记录都列在一个列表中 顺便说一句,我不想将df转换为rdd的原因是,我必须将这个(减少的)数据帧连接到另一个数据帧,并且我正在对连接键进行重新分区,这使得它更快,我想rdd也不能这样做 任

  • 问题内容: 假设我的格式如下: 我想将小数点替换为空白,使其看起来像这样: 我该怎么做呢?我以为可以解决问题,但是当我尝试这样时: 我收到了一个错误消息,因为它可能不是字符。那是有道理的,那么我还能怎么完成我想要的? 问题答案: 如果您只是将单引号换成双引号,那么这将起作用,因为空字符串是合法值,而不是“空字符”,并且有重载。请记住,这是的超类型。

  • 问题内容: 我正在使用UpdatePanel在页面中异步调用按钮单击事件,该页面调用另一个类中的方法,该方法在输出中写出XML文件。有没有办法用JQuery而不是UpdatePanel做到这一点? 问题答案: 使用jQuery处理click事件。然后,使用此技术在后台代码中调用page方法。在这里,您可以编写XML文件或执行其他任何操作。

  • 问题内容: 我是一名工程专业的学生,​​我必须做大量的数值处理,绘图,模拟等工作。我目前使用的工具是Matlab。我在大多数作业中都用它在大学计算机中。但是,我想知道有哪些可用的免费选项。 我已经做过一些研究,许多人说python在各种情况下都可以替代matlab。我想知道如何用python做所有这些事情。我正在使用Mac,如何安装不同的python软件包。那些包是什么?这真的是可行的选择吗?使用

  • 我想用getMapAsync替换不推荐的getMap方法,但我没有使用MapFragment方法,而是使用GoogleMap方法,如下所示: 如果我像这样将googleMap替换为MapFragment,我将无法再设置映射类型,等等。那么,在我的情况下,如何更改为getMapAsync?