在收集时由PySpark重置重写的dunder方法

时间:2017-10-25 05:42:06

标签: python pyspark

我尝试使用PySpark对JSON Lines文本文件中的数据进行少量转换。数据是一些我需要转换为带有重写__eq__方法的namedTuple的dicts。这就是它的样子

class TaggedAndLabeled(namedtuple("Foo", "tags labels")):

    def __eq__(self, other):
        return other in self.labels

我可以做我需要的东西(即,如果标签在其标签中,则返回TaggedAndLabeled对象的位置)并带有列表comp但我认为它更干净或更聪明且被覆盖{ {1}}。问题是,对象的这一部分(我认为)一旦通过PySpark就无法反序列化。

让我们说数据看起来像这样

__eq__

然后,这是使用PySpark读入和转换数据的结果。

{"id": [0], "labels": ["foo", "bar"]}
{"id": [1], "labels": ["biz", "baz"]}
{"id": [2], "labels": ["spam", "ham"]}

打印

import json
from collections import namedtuple
from pyspark import SparkContext

class TaggedAndLabeled(namedtuple("Foo", "tags labels")):

    def __eq__(self, other):
        return other in self.labels


def main(data, neg_size_multiplier=10):

    sc = SparkContext()

    raw_data = sc.textFile(data)
    tagged_data = raw_data.map(json.loads)
                          .map(lambda data: TaggedAndLabeled(tuple(data['id']), tuple(data['labels'])))

    a = TaggedAndLabeled(tuple([0]), tuple(['foo', 'bar']))
    b = tagged_data.collect()
    print(a == 'foo')
    print(b[0] == 'foo')

我想指出所有dunder方法都会发生这种情况。如果我覆盖True False 它被替换为Object on collection中的默认值,这使得我认为这是一个反序列化问题。

0 个答案:

没有答案