Todos los productos
Search
Centro de documentos

MaxCompute:Parámetros dinámicos para UDAF y UDTF

Última actualización: Sep 04, 2026

Este tema describe cómo usar parámetros dinámicos con la anotación Resolve en las funciones UDAF y UDTF de MaxCompute.

Sintaxis extendida para la anotación Resolve

En MaxCompute, las funciones UDAF y UDTF usan la anotación Resolve para determinar la firma de la función.

@com.aliyun.odps.udf.annotation.Resolve("BIGINT->DOUBLE")
public class UDTFClass extends UDTF {
    ...
}
Nota

Este ejemplo define una UDTF que acepta un parámetro de entrada BIGINT y devuelve un valor DOUBLE.

MaxCompute admite las siguientes extensiones para la sintaxis de la anotación Resolve:

  • Use * en la lista de parámetros de entrada para aceptar un número variable de parámetros de cualquier tipo. Por ejemplo, @Resolve('double,*->String') indica que la función acepta un DOUBLE como primer parámetro de entrada, seguido de cualquier cantidad de parámetros subsecuentes de cualquier tipo. Posteriormente, escriba código para comprobar el número y los tipos de los parámetros de entrada y procesarlos en consecuencia. Este mecanismo es similar a la función printf en C.

    Nota

    El asterisco tiene un significado diferente en la lista de valores de retorno.

  • Use la palabra clave any en la lista de parámetros de entrada para representar un parámetro de cualquier tipo. Por ejemplo, @Resolve('double,any->string') indica que la función acepta un primer parámetro de entrada de tipo DOUBLE y un segundo parámetro de entrada de cualquier tipo.

    Nota

    La palabra clave any no se puede usar en la lista de valores de retorno ni para subtipos de tipos complejos, como ARRAY.

  • El valor de retorno de una UDTF puede ser un asterisco (*), que representa un número arbitrario de valores de tipo STRING. La cantidad de valores de retorno depende del número de alias especificados al invocar la función. Por ejemplo, con la anotación @Resolve("ANY,ANY->DOUBLE,*"), la función se llama como UDTF(x, y) as (a, b, c). En este caso, se especifican tres alias después de as: a, b y c. El editor determina que a es de tipo DOUBLE, tal como se especificó en el primer valor de retorno de la anotación, y que b y c son de tipo STRING. Dado que se especificaron tres valores de retorno, la UDTF debe enviar mediante forward un arreglo de longitud 3 cuando se invoque el método forward. De lo contrario, se producirá un error en tiempo de ejecución.

    Nota

    Este tipo de error no se puede detectar durante la compilación. Por lo tanto, al llamar a una UDTF, el número de alias en su consulta SQL debe coincidir con el número de columnas que devuelve la UDTF. Esta función no aplica a las UDAF, ya que siempre tienen un único valor de retorno.

Ejemplo de UDTF

import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
import org.json.JSONException;
import org.json.JSONObject;
@Resolve("STRING,*->STRING,*")
public class JsonTuple extends UDTF {
  private Object[] result = null;
  @Override
  public void process(Object[] input) throws UDFException {
    if (result == null) {
      result = new Object[input.length];
    }
    try {
      JSONObject obj = new JSONObject((String)input[0]);
      for (int i = 1; i < input.length; i++) {
        // The variable-length part of the return value must consist of STRING types.
        result[i] = String.valueOf(obj.get((String)(input[i])));
      }
      result[0] = null;
    } catch (JSONException ex) {
      for (int i = 1; i < result.length; i++) {
        result[i] = null;
      }
      result[0] = ex.getMessage();
    }
    forward(result);
  }
}

En este ejemplo de UDTF, el número de valores de retorno lo determina la cantidad de parámetros de entrada. El primer parámetro de entrada es una cadena JSON y los parámetros subsiguientes son las claves que se extraerán del objeto JSON. El primer valor de retorno informa sobre cualquier error de análisis sintáctico. Si el análisis es exitoso, este valor es null y los valores posteriores corresponden al contenido extraído para cada clave. A continuación se presentan ejemplos que demuestran el uso de esta UDTF.

-- Customize the number of output aliases based on the number of input parameters.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b FROM jsons;

-- When no JSON fields are to be parsed, expect only the error message column.
SELECT my_json_tuple(json) as exceptions FROM jsons;

-- The following SQL statement causes a runtime error because the number of aliases
-- does not match the actual number of outputs.
-- Note that this error cannot be detected at compile time.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b, c FROM jsons;

Si las extensiones descritas en este tema no satisfacen sus requisitos empresariales, puede implementar una funcionalidad similar mediante UDT. Para obtener más información, consulte Descripción general de UDT.

Nota

Para ver ejemplos de UDAF y UDTF en Python, consulte Python 3 UDAF y Python 3 UDTF to read MaxCompute resource example.