Tous les produits
Search
Centre de documentation

MaxCompute:Exemple : Lire des ressources MaxCompute avec une UDTF Java

Dernière mise à jour :Aug 21, 2026

Cette rubrique explique comment lire des ressources MaxCompute à l'aide d'une UDTF Java dans MaxCompute Studio.

Prérequis

Exemple de code UDTF

Le code suivant illustre l'implémentation de l'UDTF Java.

Remarque

Catégorie de paramètre

Type de paramètre

Description

Paramètre d'entrée

string

Premier paramètre d'entrée.

string

Deuxième paramètre d'entrée.

Paramètre de sortie

string

Valeur du premier paramètre d'entrée.

bigint

Longueur du deuxième paramètre d'entrée.

string

Chaîne concaténée contenant le nombre de lignes issues de file_resource.txt ainsi que les nombres d'enregistrements provenant des ressources table_resource1 et table_resource2.

package com.aliyun.odps.examples.udf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import com.aliyun.odps.udf.ExecutionContext;
import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
/**
 * project: example_project 
 * table: wc_in2 
 * partitions: p1=2,p2=1 
 * columns: cola,colc
 */
@Resolve("string,string->string,bigint,string")
public class UDTFResource extends UDTF {
  ExecutionContext ctx;
  long fileResourceLineCount;
  long tableResource1RecordCount;
  long tableResource2RecordCount;
  @Override
  public void setup(ExecutionContext ctx) throws UDFException {
  this.ctx = ctx;
  try {
   InputStream in = ctx.readResourceFileAsStream("file_resource.txt");
   BufferedReader br = new BufferedReader(new InputStreamReader(in));
   String line;
   fileResourceLineCount = 0;
   while ((line = br.readLine()) != null) {
     fileResourceLineCount++;
   }
   br.close();
   Iterator<Object[]> iterator = ctx.readResourceTable("table_resource1").iterator();
   tableResource1RecordCount = 0;
   while (iterator.hasNext()) {
     tableResource1RecordCount++;
     iterator.next();
   }
   iterator = ctx.readResourceTable("table_resource2").iterator();
   tableResource2RecordCount = 0;
   while (iterator.hasNext()) {
     tableResource2RecordCount++;
     iterator.next();
   }
 } catch (IOException e) {
   throw new UDFException(e);
 }
}
   @Override
   public void process(Object[] args) throws UDFException {
     String a = (String) args[0];
     long b = args[1] == null ? 0 : ((String) args[1]).length();
     forward(a, b, "fileResourceLineCount=" + fileResourceLineCount + "|tableResource1RecordCount="
     + tableResource1RecordCount + "|tableResource2RecordCount=" + tableResource2RecordCount);
    }
}

La dépendance pom.xml suivante est requise pour les tests locaux.

<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-udf-local</artifactId>
    <version>0.48.0-public</version>
</dependency>

Procédure

Tests locaux

  1. Dans MaxCompute Studio, créez une classe Java UDTF nommée UDTFResource en utilisant le code fourni dans la section Exemple de code UDTF.

  2. Configurez les paramètres d'exécution en fonction du contenu de la ressource warehouse du module Java MaxCompute.

    Remarque
    • Les paramètres d'entrée correspondent aux valeurs des première et troisième colonnes de chaque ligne de la partition p1=2, p2=1 de la table wc_in2 présente dans la ressource locale.

    • Lors de l'exécution, le code lit les données du fichier local file_resource.txt, de la table wc_in1 (mappée à la ressource table_resource1) et de la partition p1=2, p2=1 de la table wc_in2 (mappée à la ressource table_resource2).

    111ty

  3. Cliquez avec le bouton droit sur le nom de la classe UDTFResource et sélectionnez Run.

    image

    p846007

Tests côté client

  1. Dans le coin supérieur gauche d'IDEA, cliquez sur imageProject Explorer, puis sélectionnez imageAdd Resource.

    image

  2. Ajoutez le fichier file_resource.txt en vous basant sur les informations de votre instance MaxCompute.

    image

  3. Dans votre projet MaxCompute, créez et remplissez les tables de données exemples wc_in1 et wc_in2.

    CREATE TABLE wc_in1 (
      col1 STRING,
      col2 STRING,
      col3 STRING,
      col4 STRING
    );
    
    INSERT INTO wc_in1 VALUES 
    ('A1','A2','A3','A4'),
    ('A1','A2','A3','A4'),
    ('A1','A2','A3','A4'),
    ('A1','A2','A3','A4');
    
    CREATE TABLE wc_in2 (
        cola STRING,
        colb STRING,
        colc STRING
    ) PARTITIONED BY (p1 STRING, p2 STRING);
    
    ALTER TABLE wc_in2 ADD PARTITION  (p1='2',p2='1');
    
    INSERT INTO wc_in2 PARTITION (p1='2',p2='1') VALUES 
    ('three1','three2','three3'),
    ('three1','three2','three3'),
    ('three1','three2','three3'); 
  4. Mappez les tables wc_in1 et wc_in2 que vous avez créées dans MaxCompute vers les ressources table_resource1 et table_resource2.

    Ajoutez la ressource wc_in1.

    image

    Ajoutez la ressource wc_in2.

    image

  5. Empaquetez l'UDTF dans un fichier JAR, téléchargez-le dans votre projet MaxCompute et enregistrez-le en tant que fonction nommée my_udtf. Pour le déploiement, cliquez avec le bouton droit sur le nom de la classe UDTFResource et sélectionnez Deploy to Server.... Dans la boîte de dialogue qui s'affiche, ajoutez les ressources requises file_resource.txt, table_resource1 et table_resource2 dans la section Extra resources.

    image

  6. Cliquez sur imageProject Explorer. Cliquez avec le bouton droit sur votre projet MaxCompute cible et sélectionnez Open Console pour démarrer le client MaxCompute. Ensuite, exécutez une commande SQL pour appeler l'UDTF.

    image

    image

    Voici un exemple de commande :

    SELECT my_udtf("10","20") AS (a, b, fileResourceLineCount);