def create_runner(runner_type: str, name: str, index: int, op_name: str, tag: str, hub_op_id: str, op_args: Dict[(str, any)], reader: DataFrameReader, writer: DataFrameWriter) -> runner_base.RunnerBase:
    if (runner_type.lower() == 'map'):
        return map_runner.MapRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'flatmap'):
        return flatmap_runner.FlatMapRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'filter'):
        return filter_runner.FilterRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'concat'):
        return concat_runner.ConcatRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() in ['window', 'time_window']):
        return window_runner.WindowRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'generator'):
        return generator_runner.GeneratorRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    else:
        raise AttributeError('No runner type named: {}'.format(runner_type))
def create_runner(runner_type: str, name: str, index: int, op_name: str, tag: str, hub_op_id: str, op_args: Dict[(str, any)], reader: DataFrameReader, writer: DataFrameWriter) -> runner_base.RunnerBase:
    if (runner_type.lower() == 'map'):
        return map_runner.MapRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'flatmap'):
        return flatmap_runner.FlatMapRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'filter'):
        return filter_runner.FilterRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'concat'):
        return concat_runner.ConcatRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() in ['window', 'time_window']):
        return window_runner.WindowRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    elif (runner_type.lower() == 'generator'):
        return generator_runner.GeneratorRunner(name, index, op_name, tag, hub_op_id, op_args, reader, writer)
    else:
        raise AttributeError('No runner type named: {}'.format(runner_type))