PySpark多个过滤器不起作用

时间:2018-07-17 09:54:24

标签: python apache-spark pyspark

我在这里有个摇头丸。我想从配置文件中捕获多个过滤器,并将它们应用于我的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仅实际应用了最后一个过滤器。

0 个答案:

没有答案