我尝试使用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中的默认值,这使得我认为这是一个反序列化问题。