Привет, я новичок ie в pyspark, мне нужно создать функцию, которая получает на вход набор точек S и целое число k <| S |, произвольно выбирает k точек из S (пусть S ' обозначить набор этих k точек) и возвращает максимальное расстояние d (x, y) по всем x в S 'и y в S. Моя идея состоит в том, что мне нужно применить функцию на первой карте, которая случайным образом выбирает некоторые элементы и делает его копии (по одному для каждого кластера). Проблема в том, что мне нужно реплицировать ровно k точек, поэтому мне нужна глобальная переменная, которая хранит счет того, сколько точек реплицировано работниками, или, возможно, мне нужно использовать одного работника, чтобы получить k баллов. </p>
Вот первая рабочая версия, которая вычисляет максимальное расстояние между первым элементом каждого кластера и всеми остальными в одном кластере.
def twoApproxMPD(S,k):
#split randomly between k clusters (i decided to make as many clusters as k-points)
def mapPart(coord):
mappedpair = ((coord[0] % k, (coord[0], coord[1])))
#here i feel like i need to add the random copy maker of the k points
return [mappedpair]
#return the maxpairwise of each clusters
def getMax(coords):
maxds = 0
#i get the first element of every cluster
co1 = next(coords)
x0,x1 = co1[1][1]
#iterate over all other to get the max
for co in coords:
y0,y1 = co[1][1]
temp = math.sqrt((x0-y0)**2 + (x1-y1)**2)
if temp > maxds:
maxds = temp
k = [(0,maxds)]
return k
g = S.zipWithIndex().map(lambda x: (x[1], x[0]))
.flatMap(mapPart).mapPartitions(getMax).reduceByKey(max).values()
return g
S: 40,7591, -73,9684 кортежей, i добавьте индекс zipwithindex (), поменяйте местами индекс и координаты (первая карта), чтобы я мог разделить элементы между кластерами с помощью flatMap (),