我正在尝试为一些Spark Streaming作业编写一个抽象,每个作业都有一部分代码在所有这些作业之间相同(因此需要抽象)。
每个作业的格式都采用以下格式:
dStream \
.filter(lambda rec: rec[self.EVENT_KEY_VALUE[0]] in list(self.EVENT_KEY_VALUE[1])) \
.filter(lambda rec: self.EVENT_FIELDS.issubset(set(rec.keys()))) \
for INPUT in INPUTS:
dStream \
.map(lambda rdd: format_record_keys_for_salesforce(self.INPUT))
for map_func in OPTIONAL_MAPS:
dStream \
.map(map_func)
return dStream.map(self.OUTPUT.project_row)
始终有一个format_record_keys_for_salesforce
地图阶段,始终是dStream.map(self.OUTPUT.project_row)
阶段。问题来自前两个filter()
。每个工作中几乎总是有两个过滤阶段,但有时工作不需要它。我宁愿让过滤器是冗余的,除了返回True
之外什么都不做,而不是让dev需要编写额外的代码。
那么,我如何写一个list
,其中任意值是其成员?我们事先并不知道这些值,只是它是列表的成员。
有点像:
>> 'a' in list(all)
True
>> 5 in list(all)
True
>> *anything* in list(all)
True
>> ALL_NATURAL_NUMBERS in list(all)
True
>> ALL_SUBSETS_OF_NATURAL_NUMBERS in list(all)
True
etc...
这是可能的,还是我必须从抽象中删除这些阶段,并将其留给开发人员写作以确定他们是否需要过滤器?
答案 0 :(得分:2)
如果我理解正确,您只想模仿__contains__
运算符。所以可能是这样的:
class MockList(list):
def __contains__(self, item):
return True
答案 1 :(得分:1)
如果我理解正确,你需要一个类似于列表的对象,声称它包含任何对象。
您需要定义list-like class。
我能想到的最简单的解决方案是肮脏的黑客攻击:
class MyList(list):
def __contains__(self, item):
return True
然后分配给anyValue
的任何值:
>>> anyValue in MyList([])
True