Tous les produits
Search
Centre de documentation

MaxCompute:Paramètres dynamiques pour les UDAF et UDTF

Dernière mise à jour :Aug 21, 2026

Cette rubrique explique comment utiliser des paramètres dynamiques avec l'annotation Resolve dans les UDAF et UDTF MaxCompute.

Syntaxe étendue de l'annotation Resolve

Dans MaxCompute, les UDAF et UDTF utilisent l'annotation Resolve pour déterminer la signature de la fonction.

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

Cet exemple définit une UDTF qui accepte un paramètre d'entrée BIGINT et renvoie une valeur DOUBLE.

MaxCompute prend en charge les extensions suivantes pour la syntaxe de l'annotation Resolve :

  • Utilisez * dans la liste des paramètres d'entrée pour accepter un nombre variable de paramètres de n'importe quel type. Par exemple, @Resolve('double,*->String') indique que la fonction accepte un DOUBLE comme premier paramètre d'entrée, suivi d'un nombre quelconque de paramètres supplémentaires de n'importe quel type. Vous devez ensuite écrire du code pour vérifier le nombre et les types des paramètres d'entrée et les traiter en conséquence. Ce mécanisme est similaire à la fonction printf en C.

    Remarque

    L'astérisque a une signification différente dans la liste des valeurs de retour.

  • Utilisez le mot-clé any dans la liste des paramètres d'entrée pour représenter un paramètre de n'importe quel type. Par exemple, @Resolve('double,any->string') indique que la fonction accepte un premier paramètre d'entrée de type DOUBLE et un second paramètre d'entrée de n'importe quel type.

    Remarque

    Le mot-clé any ne peut pas être utilisé dans la liste des valeurs de retour ni pour les sous-types de types complexes, tels que ARRAY.

  • La valeur de retour d'une UDTF peut être un astérisque (*), qui représente un nombre arbitraire de valeurs de type STRING. Le nombre de valeurs de retour dépend du nombre d'alias spécifiés lors de l'appel de la fonction. Par exemple, avec l'annotation @Resolve("ANY,ANY->DOUBLE,*"), la fonction est appelée sous la forme UDTF(x, y) as (a, b, c). Dans ce cas, trois alias sont spécifiés après as : a, b et c. L'éditeur détermine que a est de type DOUBLE, tel que spécifié comme première valeur de retour dans l'annotation, et que b et c sont de type STRING. Étant donné que trois valeurs de retour sont spécifiées, l'UDTF doit forward un tableau de longueur 3 lorsque la méthode forward est appelée. Sinon, une erreur d'exécution se produit.

    Remarque

    Ce type d'erreur ne peut pas être détecté au moment de la compilation. Par conséquent, lorsque vous appelez une UDTF, le nombre d'alias dans votre requête SQL doit correspondre au nombre de colonnes renvoyées par l'UDTF. Cette fonctionnalité ne s'applique pas aux UDAF, qui ont toujours une seule valeur de retour.

Exemple d'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);
  }
}

Dans cet exemple d'UDTF, le nombre de valeurs de retour est déterminé par le nombre de paramètres d'entrée. Le premier paramètre d'entrée est une chaîne JSON, et les paramètres suivants sont les clés à extraire de l'objet JSON. La première valeur de retour signale les erreurs d'analyse. Si l'analyse réussit, cette valeur est nulle et les valeurs suivantes correspondent au contenu extrait pour chaque clé. Les exemples suivants illustrent cette 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 les extensions décrites dans cette rubrique ne répondent pas à vos besoins métier, vous pouvez implémenter des fonctionnalités similaires en utilisant des UDT. Pour plus d'informations, consultez Présentation des UDT.

Remarque

Pour des exemples Python d'UDAF et d'UDTF, voir UDAF Python 3 et Exemple d'UDTF Python 3 pour lire une ressource MaxCompute.