Flink Stream Batch Integrated Computing (12) : Construction de l'API PyFlink Tabel

Table des matières

1. Créer des tables source et résultat.

Créer et enregistrer des tables avec des noms de source et de récepteur respectivement

Utilisez la méthode TableEnvironment.execute_sql() pour enregistrer les tables source et résultat via des instructions DDL

2. Créer une tâche

3. Soumettre des travaux PyFlink


1. Créer des tables source et résultat.

Créer et enregistrer des tables avec des noms de source et de récepteur respectivement

Parmi eux, la table source source a une colonne : word, qui représente le mot lu dans le fichier d'entrée spécifié par input_path ;

Le récepteur de la table de résultats comporte deux colonnes : word et count, et le résultat de cette table sera généré dans le fichier de sortie spécifié par output_path.

tableau des sources

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')

tableau évier

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())

Utilisez la méthode TableEnvironment.execute_sql() pour enregistrer les tables source et résultat via des instructions 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. Créer une tâche

Le travail lit les données de la source de la table, effectue certaines transformations et écrit les résultats dans le récepteur de la table.

Enfin, tout ce qui doit être fait est de démarrer le travail de l'API Flink Python Table.

Toutes les opérations ci-dessus, telles que la création de la table source, l'exécution de transformations et l'écriture de la table de résultats ne servent qu'à créer le diagramme logique du travail. Ce n'est que lorsque execute_insert(sink_name) est appelé que le travail sera réellement soumis au cluster ou localement pour exécution.

@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. Soumettre des travaux PyFlink

Créez un programme API Python Table et exécutez-le dans un mini cluster local.

python word_count.py

Soumettre la tâche au cluster distant pour exécution

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

Lorsqu'une tâche est exécutée dans un environnement de mini cluster (par exemple, dans un IDE) et que les API suivantes sont utilisées dans la tâche (telles que TableEnvironment.execute_sql, Statementset.execute de l'API Python Table et StreamExecutionEnvironment.execute_async de Python DataStream API), car ces API sont asynchrones, n'oubliez pas d'attendre explicitement la fin de l'exécution du travail.

Sinon, le programme se fermera avant la fin de l'exécution du travail soumis, de sorte que le résultat de l'exécution du travail soumis ne pourra pas être observé.

Remarque : Lorsque vous soumettez une tâche à un cluster distant, il n'est pas nécessaire d'attendre explicitement la fin de la tâche. Par conséquent, avant de soumettre une tâche à un cluster distant, n'oubliez pas de supprimer la logique de code qui attend la fin de la tâche.

Exécuter des tâches d'API SQL/Table de manière asynchrone

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

Exécuter des tâches DataStream de manière asynchrone

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

Guess you like

Origin blog.csdn.net/victory0508/article/details/131554728