Índice
1. Crie tabelas de origem e resultado.
Crie e registre tabelas com nomes de origem e destino, respectivamente
1. Crie tabelas de origem e resultado.
Crie e registre tabelas com nomes de origem e destino, respectivamente
Dentre elas, a tabela source source possui uma coluna: word, que representa a palavra lida do arquivo de entrada especificado por input_path;
O coletor da tabela de resultados tem duas colunas: palavra e contagem, e o resultado desta tabela será enviado para o arquivo de saída especificado por output_path.
tabela de origem
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 pia
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())
Use o método TableEnvironment.execute_sql() para registrar as tabelas de origem e resultado por meio de instruções 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. Crie um trabalho
A tarefa lê dados da origem da tabela, executa algumas transformações e grava os resultados no coletor da tabela.
Por fim, tudo o que precisa ser feito é iniciar o trabalho da API de tabela do Flink Python.
Todas as operações acima, como criar a tabela de origem, realizar transformações e escrever a tabela de resultados são apenas para construir o diagrama lógico do trabalho. Somente quando execute_insert(sink_name) é chamado, o trabalho será realmente enviado para o cluster ou localmente para execução.
@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. Envio de trabalhos PyFlink
Crie um programa Python Table API e execute-o em um minicluster local.
python word_count.py
Envie o trabalho para o cluster remoto para execução
flink run --python examples/python/table/word_count.py
Quando um trabalho é executado em um ambiente de minicluster (por exemplo, em um IDE) e as seguintes APIs são usadas no trabalho (como TableEnvironment.execute_sql, Statementset.execute da API Python Table e StreamExecutionEnvironment.execute_async do Python DataStream API), porque essas APIs são assíncronas, lembre-se de aguardar explicitamente a conclusão da execução do trabalho.
Caso contrário, o programa será encerrado antes que a execução da tarefa enviada seja concluída, de modo que o resultado da execução da tarefa enviada não possa ser observado.
Observação: ao enviar uma tarefa para um cluster remoto, não há necessidade de esperar explicitamente a conclusão da tarefa, portanto, antes de enviar uma tarefa para um cluster remoto, lembre-se de remover a lógica do código que aguarda a conclusão da tarefa.
Execute trabalhos de API SQL/Tabela de forma assíncrona
t_result = table_env.execute_sql(...)
t_result.wait()
Execute tarefas DataStream de forma assíncrona
job_client = stream_execution_env.execute_async('My DataStream Job')
job_client.get_job_execution_result().result()