我在这里有个摇头丸。我想从配置文件中捕获多个过滤器,并将它们应用于我的RDD。我创建了一个函数分派器来动态生成过滤器函数。我的方法遍历过滤器,创建函数并将其应用到RDD,覆盖先前的RDD。在循环中,我打印出过滤器函数的地址,以确保传递的是不同的地址。但是最后只应用了最后一个过滤器。这是由于延迟评估而导致我覆盖了函数过滤器吗?
ROWKEY_QUALIFIER = {'date': 0,
'carrier': 1,
'flight_number': 2,
'origin': 4}
FILTER_DICT = {'equals': lambda x, y: x == y,
'greater': lambda x, y: x > y,
'greater_or_equal': lambda x, y: x >= y,
'smaller': lambda x, y: x < y,
'smaller_or_equal': lambda x, y: x <= y}
def filter_dispatcher(qualifier, filter_type):
def filter_function(row, filter_value):
rowkey_qualifier = row.row.split('|')[ROWKEY_QUALIFIER[qualifier]]
return FILTER_DICT[filter_type](rowkey_qualifier, filter_value)
return filter_function
def filter_rowkeys(rdd, table):
for filter_option in table.filters:
if filter_option['filter_column_family'] == 'rowkey':
filter_function = filter_dispatcher(filter_option['filter_qualifier'],
filter_option['filter_type'])
print(filter_function)
rdd = rdd.filter(lambda row: filter_function(row, filter_option['filter_value']))
return rdd
这里,评估后返回的RDD仅实际应用了最后一个过滤器。