Tabla de contenido
1. Crear tablas de origen y de resultados.
Cree y registre tablas con nombres de fuente y receptor respectivamente
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()