Numpy 无法访问pyspark中的流水线Rdd

Numpy 无法访问pyspark中的流水线Rdd,numpy,apache-spark,pyspark,rdd,Numpy,Apache Spark,Pyspark,Rdd,我正在尝试使用pyspark从头开始实现K-means。我正在rdd上执行各种操作,但当我试图显示最终处理的rdd的结果时,一些错误,如“Pipelined rdd's cant iterated”或类似的错误,以及.collect()之类的错误,由于 没有进展的rdd问题 from __future__ import print_function import sys import numpy as np def closestPoint(p, centers): bestIndex

我正在尝试使用pyspark从头开始实现K-means。我正在rdd上执行各种操作,但当我试图显示最终处理的rdd的结果时,一些错误,如“Pipelined rdd's cant iterated”或类似的错误,以及.collect()之类的错误,由于 没有进展的rdd问题

from __future__ import print_function
import sys
import numpy as np
def closestPoint(p, centers):
    bestIndex = 0
    closest = float("+inf")
    for i in range(len(centers)):
        tempDist = np.sum((p - centers[i]) ** 2)
        if tempDist < closest:
            closest = tempDist
            bestIndex = i
    return bestIndex

data=SC.parallelize([1, 2, 3,5,7,3,5,7,3,6,4,66,33,66,22,55,77])

K = 3
convergeDist = float(0.1)

kPoints = data.takeSample(False, K, 1)
tempDist = 1.0

while tempDist > convergeDist:
    closest = data.map(
        lambda p: (closestPoint(p, kPoints), (p, 1)))



    pointStats = closest.reduceByKey(
        lambda p1_c1, p2_c2: (p1_c1[0] + p2_c2[0], p1_c1[1] + p2_c2[1]))

    newPoints = pointStats.map(
        lambda st: (st[0], st[1][0] / st[1][1]))
    print(newPoints)


    tempDist = sum(np.sum((kPoints[iK] - p) ** 2) for (iK, p) in newPoints).collect()

       # tempDist = sum(np.sum((kPoints[iK] - p) ** 2) for (iK, p) in newPoints)




    for (iK, p) in newPoints:
        kPoints[iK] = p

print("Final centers: " + str(kPoints))
from\uuuuu future\uuuuu导入打印功能
导入系统
将numpy作为np导入
def闭合点(p,中心):
最佳索引=0
最近=浮动(“+inf”)
对于范围内的i(len(中心)):
tempDist=np.sum((p-中心[i])**2)
如果tempDist<最近:
最近的=tempDist
最佳索引=i
返回最佳索引
数据=SC.并行化([1,2,3,5,7,3,5,7,3,6,4,66,33,66,22,55,77])
K=3
收敛距离=浮点(0.1)
kPoints=data.takeSample(False,K,1)
tempDist=1.0
当tempDist>convergeDist时:
最近的=data.map(
lambda p:(闭点(p,kPoints),(p,1)))
pointStats=closest.reduceByKey(
lambda p1_c1,p2_c2:(p1_c1[0]+p2_c2[0],p1_c1[1]+p2_c2[1]))
newPoints=pointStats.map(
lambda街:(街[0],街[1][0]/街[1][1]))
打印(新点)
tempDist=sum(np.sum((kPoints[iK]-p)**2)表示新点中的(iK,p)。collect()
#tempDist=sum(np.sum((kPoints[iK]-p)**2)表示新点中的(iK,p)
对于新点中的(iK,p):
kPoints[iK]=p
打印(“最终中心:+str(kPoints))
我得到的错误是:

TypeError:“PipelinedRDD”对象不可编辑


您不能迭代RDD,您需要首先调用一个操作将数据返回到驱动程序。快速样本:

>>> test = sc.parallelize([1,2,3])
>>> for i in test:
...    print i
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'RDD' object is not iterable

接下来,调用一个操作并将数据返回给驱动程序,注意不要有太多数据,否则会出现内存不足异常

您正在混合Spark和Numpy。只选择一个
kPoints.collect()
就可以了。我不理解你关于这是一个问题的观点。这一行似乎是问题所在:tempDist=sum(np.sum((kPoints[iK]-p)**2)表示newPoints中的(iK,p)。collect()…显然,您不能使用for循环/迭代newPoints(这是一种管道化RDD),通常在常规RDD上工作的东西,例如简单的对方付费呼叫,似乎对newPoints管道化RDD不起作用。
>>> for i in test.collect():
...    print i
1                                                                               
2
3