Как случайным образом выбрать k предметов в RDD - PullRequest
0 голосов
/ 30 апреля 2020

Привет, я новичок 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 (),

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...