Используйте методы объекта внутри функции UDF pyspark - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь обновить столбец данных на основе сложных вычислений (внутри метода внутри класса). Из того, что я узнал до сих пор, вы можете обновлять столбцы в фреймах данных, используя пользовательские функции. К сожалению, пользовательские функции должны иметь статус c. Есть ли обходной путь?

Вот соответствующая часть моего кода:

'''
Louvain Community Detection Algoritm
'''
class LouvainCommunityDetection():

    def __init__(self, graph):

        self.graph = graph
        self.changeInModularity = True
        self.changeCommunityIdUDF = udf(LouvainCommunityDetection.changeCommunityId, IntegerType())


    @staticmethod
    def changeCommunityId(col):

        newCommunityId = 123
        # here I should compute the newCommunityId using complex operations
        # involving other methods in this class
        # like self.computeModularityGain
        # but since this is a static method... I can't use those
        return newCommunityId


    def louvain(self):

        oldModularity = 0 # since intially each node represents a community

        # retrieve graph vertices and edges dataframes
        verticesDf = self.graph.vertices
        edgesDf = self.graph.edges

        canOptimize = True

        while canOptimize:

            while self.changeInModularity:

                self.changeInModularity = False
                verticesDf = verticesDf.select('id', 'tweetCreated', 'userId', 'userName', 'parentId', self.changeCommunityIdUDF('communityId').alias('udfResult'))

                verticesDf.show()

                self.changeInModularity = False

            canOptimize = False

1 Ответ

1 голос
/ 12 апреля 2020

Я нашел решение, здесь есть удивительное и ясное объяснение.

Проблема в том, что когда появляется какой-либо из членов объекта (например, self.changeInModularity) в функции udf при применении его к фрейму данных pyspark объект self должен быть сериализован, но это не может быть.

(на удивление простой) способ - создать ссылку на этот член, но не объект:

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