Flink Stream Batch Integrated Computing (12): construcción de PyFlink Tabel API

Tabla de contenido

1. Crear tablas de origen y de resultados.

Cree y registre tablas con nombres de fuente y receptor respectivamente

Utilice el método TableEnvironment.execute_sql() para registrar las tablas de origen y resultado a través de instrucciones DDL

2. Crea un trabajo

3. Envío de trabajos de PyFlink


1. Crear tablas de origen y de resultados.

Cree y registre tablas con nombres de fuente y receptor respectivamente

Entre ellos, la fuente de la tabla fuente tiene una columna: palabra, que representa la palabra leída del archivo de entrada especificado por ruta_entrada;

El sumidero de la tabla de resultados tiene dos columnas: palabra y recuento, y el resultado de esta tabla se enviará al archivo de salida especificado por ruta_salida.

tabla fuente

t_env.create_temporary_table(
    'source',
    TableDescriptor.for_connector('filesystem')
        .schema(Schema.new_builder()
                .column('word', DataTypes.STRING())
                .build())
        .option('path', input_path)
        .format('csv')
        .build())
tab = t_env.from_path('source')

mesa de fregadero

t_env.create_temporary_table(
    'sink',
    TableDescriptor.for_connector('filesystem')
        .schema(Schema.new_builder()
                .column('word', DataTypes.STRING())
                .column('count', DataTypes.BIGINT())
                .build())
        .option('path', output_path)
        .format(FormatDescriptor.for_format('canal-json')
                .build())
        .build())

Utilice el método TableEnvironment.execute_sql() para registrar las tablas de origen y resultado a través de instrucciones DDL

my_source_ddl = """
    create table source (
        word STRING
    ) with (
        'connector' = 'filesystem',
        'format' = 'csv',
        'path' = '{}'
    )
""".format(input_path)

my_sink_ddl = """
    create table sink (
        word STRING,
        `count` BIGINT
    ) with (
        'connector' = 'filesystem',
        'format' = 'canal-json',
        'path' = '{}'
    )
""".format(output_path)
t_env.execute_sql(my_source_ddl)
t_env.execute_sql(my_sink_ddl)

2. Crea un trabajo

El trabajo lee datos del origen de la tabla, realiza algunas transformaciones y escribe los resultados en el receptor de la tabla.

Finalmente, todo lo que se necesita hacer es iniciar el trabajo de la API de tabla Flink Python.

Todas las operaciones anteriores, como la creación de la tabla de origen, la realización de transformaciones y la escritura de la tabla de resultados, son solo para crear el diagrama lógico del trabajo. Solo cuando se llama a execute_insert(sink_name), el trabajo se enviará al clúster o localmente para ejecución.

@udtf(result_types=[DataTypes.STRING()])
def split(line: Row):
    for s in line[0].split():
        yield Row(s)

# 计算 word count
tab.flat_map(split).alias('word') \
    .group_by(col('word')) \
    .select(col('word'), lit(1).count) \
    .execute_insert('sink') \
    .wait()

3. Envío de trabajos de PyFlink

Cree un programa API de tabla de Python y ejecútelo en un mini clúster local.

python word_count.py

Envíe el trabajo al clúster remoto para su ejecución.

flink run --python examples/python/table/word_count.py

Cuando se ejecuta un trabajo en un entorno de miniclúster (por ejemplo, en un IDE) y se usan las siguientes API en el trabajo (como TableEnvironment.execute_sql, Statementset.execute de Python Table API y StreamExecutionEnvironment.execute_async de Python DataStream API), debido a que estas API son asincrónicas, recuerde esperar explícitamente a que se complete la ejecución del trabajo.

De lo contrario, el programa se cerrará antes de que se complete la ejecución del trabajo enviado, por lo que no se podrá observar el resultado de la ejecución del trabajo enviado.

Nota: Al enviar un trabajo a un clúster remoto, no es necesario esperar explícitamente a que finalice el trabajo, por lo que antes de enviar un trabajo a un clúster remoto, recuerde eliminar la lógica del código que espera a que finalice el trabajo.

Ejecutar trabajos SQL/Table API de forma asíncrona

t_result = table_env.execute_sql(...)
t_result.wait()

Ejecutar trabajos de DataStream de forma asíncrona

job_client = stream_execution_env.execute_async('My DataStream Job')
job_client.get_job_execution_result().result()

Supongo que te gusta

Origin blog.csdn.net/victory0508/article/details/131554728
Recomendado
Clasificación