Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:Java

Última atualização: Nov 03, 2026

O Realtime Compute for Apache Flink oferece suporte a funções definidas pelo usuário (UDFs) em Java para jobs do Flink SQL. Conheça os tipos de UDF, a passagem de parâmetros e observações importantes de uso.

Observações importantes

  • Para evitar conflitos de dependência de pacotes JAR durante o desenvolvimento de UDFs, considere o seguinte:

    • Verifique se a versão do Flink selecionada na página de desenvolvimento SQL corresponde à versão do Flink na dependência do Pom.

    • Para dependências relacionadas ao Flink, defina o escopo como provided adicionando <scope>provided</scope>.

    • Empacote outras dependências de terceiros usando o método Shade. Para mais informações, consulte Apache Maven Shade Plugin.

    Para obter mais detalhes sobre conflitos de dependência do Flink, consulte How do I resolve Flink dependency conflicts?.

  • Para evitar timeouts causados por chamadas frequentes a uma UDF em um job SQL, faça upload do pacote JAR da UDF como arquivo de dependência. Em seguida, declare a função no job usando a sintaxe CREATE TEMPORARY FUNCTION. Exemplo: CREATE TEMPORARY FUNCTION 'GetJson' AS 'com.soybean.function.udf.MyGetJsonObjectFunction';

Classificações de UDF

O Flink oferece suporte aos três tipos de UDFs a seguir.

Classificação

Descrição

Função escalar definida pelo usuário (UDSF)

Uma UDSF mapeia zero, um ou mais valores escalares para um novo valor escalar. Possui relação de um para um entre entrada e saída, ou seja, lê uma linha de dados e gera um único valor de saída. Para mais informações, consulte User-defined scalar functions (UDSFs).

Função de agregação definida pelo usuário (UDAF)

Uma UDAF agrega vários registros de entrada em um único valor de saída. Para mais informações, consulte User-defined aggregate functions (UDAFs).

Função com valor de tabela definida pelo usuário (UDTF)

Uma UDTF recebe zero, um ou mais valores escalares como parâmetros de entrada, podendo ter comprimento variável. É semelhante a uma UDSF, mas pode retornar qualquer número de linhas como saída, não apenas um único valor. As linhas retornadas podem conter uma ou mais colunas. Uma única chamada de função pode gerar múltiplas linhas ou colunas. Para mais informações, consulte User-defined table-valued functions (UDTFs).

Registro de UDF

  • Para saber como registrar uma UDF global, consulte Global UDFs.

  • Para saber como registrar uma UDF no nível do job, consulte Job-level UDFs.

Passagem de parâmetros para uma UDF

Configure parâmetros para uma UDF no console de desenvolvimento do Flink e referencie-os no código da UDF para modificar rapidamente os valores diretamente no console.

As UDFs fornecem um método opcional open(FunctionContext context). O FunctionContext transmite itens de configuração personalizados como parâmetros. O processo é o seguinte:

  1. Na aba Configuration da página O&M > Deployments no console de desenvolvimento do Flink, adicione o item de configuração pipeline.global-job-parameters na seção Other Configuration de Parameters.

    pipeline.global-job-parameters: | 
      'k1:{hi,hello}',
      'k2:"str:ing,str:ing"',
      'k3:"str""ing,str:ing"'

    O método FunctionContext#getJobParameter recupera apenas valores definidos em pipeline.global-job-parameters. Inclua nesse parâmetro todos os itens de configuração que a UDF utiliza. Os passos a seguir descrevem como configurar esse item.

    Etapa

    Ação

    Procedimento

    Exemplo

    Etapa 1

    Defina pares chave-valor.

    Separe a chave e o valor com dois pontos (:) e coloque cada par chave-valor entre aspas simples (').

    Nota
    • Se uma chave ou valor contiver dois pontos (:), coloque a chave ou o valor entre aspas duplas (").

    • Caso uma chave ou valor contenha dois pontos (:) e aspas duplas ("), escape o caractere com duas aspas duplas consecutivas ("").

    • Se chave = k1 e value = {hi,hello}, defina o par como 'k1:{hi,hello}'.

    • Se chave = k2 e value = str:ing,str:ing, defina o par como 'k2:"str:ing,str:ing"'

    • Se chave = k3 e value = str"ing,str:ing, defina o par como 'k3:"str""ing,str:ing"'

    Etapa 2

    Formate o valor final de pipeline.global-job-parameters como um arquivo YAML.

    Coloque cada par chave-valor em uma nova linha e separe-os por vírgulas (,).

    Nota
    • Uma string multilinha em um arquivo YAML começa com uma barra vertical (|).

    • Cada linha de uma string multilinha em um arquivo YAML deve ter o mesmo recuo.

    pipeline.global-job-parameters: | 
      'k1:{hi,hello}',
      'k2:"str:ing,str:ing"',
      'k3:"str""ing,str:ing"'
  2. No código da UDF, use FunctionContext#getJobParameter para recuperar o valor de cada item. O código a seguir serve de exemplo.

    Exemplo:

    context.getJobParameter("k1", null); // Returns the string {hi,hello}.
    context.getJobParameter("k2", null); // Returns the string str:ing,str:ing.
    context.getJobParameter("k3", null); // Returns the string str"ing,str:ing.
    context.getJobParameter("pipeline.global-job-parameters", null); // Returns null. You can only get the content defined in pipeline.global-job-parameters, not any other job configuration item.

Parâmetros nomeados

Nota

Apenas o Ververica Runtime (VVR) 8.0.7 e versões posteriores oferecem suporte ao uso de parâmetros nomeados para implementar UDFs.

Chamadas de função padrão exigem todos os parâmetros na ordem correta, o que aumenta a probabilidade de erros em funções com muitos parâmetros e impede a omissão de parâmetros opcionais. Parâmetros nomeados permitem especificar apenas os necessários. O exemplo de ScalarFunction a seguir demonstra como utilizar parâmetros nomeados.

// Implement a user-defined scalar function. The last two input parameters are optional (isOptional = true).
public class MyFuncWithNamedArgs extends ScalarFunction  {
	private static final long serialVersionUID = 1L;

	public String eval(@ArgumentHint(name = "f1", isOptional = false, type = @DataTypeHint("STRING")) String f1,
			@ArgumentHint(name = "f2", isOptional = true, type = @DataTypeHint("INT")) Integer i2,
			@ArgumentHint(name = "f3", isOptional = true, type = @DataTypeHint("LONG")) Long l3) {

		if (i2 != null) {
			return "i2#" + i2;
		}
		if (l3 != null) {
			return "l3#" + l3;
		}
		return "default#" + f1;
	}
}

Ao usar essa UDF em SQL, especifique apenas o parâmetro obrigatório ou inclua seletivamente os parâmetros opcionais.

CREATE TEMPORARY FUNCTION MyNamedUdf AS 'com.aliyun.example.MyFuncWithNamedArgs';

CREATE temporary TABLE s1 (
    a INT,
    b BIGINT,
    c VARCHAR,
    d VARCHAR,
    PRIMARY KEY(a) NOT ENFORCED
) WITH (
    'connector' = 'datagen',
    'rows-per-second'='1'
);

CREATE temporary TABLE sink (
    a INT,
    b VARCHAR,
    c VARCHAR,
    d VARCHAR
) WITH (
    'connector' = 'print'
);

INSERT INTO sink
SELECT a,
    -- Specify only the first required parameter
    MyNamedUdf(f1 => c) arg1_res,
    -- Specify the first required parameter and the second optional parameter
    MyNamedUdf(f1 => c, f2 => a) arg2_res,
    -- Specify the first required parameter and the third optional parameter
    MyNamedUdf(f1 => c, f3 => d) arg3_res
FROM s1;

Referências