Cette rubrique explique comment lire des ressources MaxCompute à l'aide d'une UDTF Java dans MaxCompute Studio.
Prérequis
Vous avez installé MaxCompute Studio, établi une connexion à un projet MaxCompute et créé un module Java MaxCompute.
Vous avez installé l'outil de développement IntelliJ IDEA 2024 et le JDK 1.8.
Pour plus d'informations, consultez les rubriques Installer MaxCompute Studio, Gérer les connexions aux projets et Créer un module Java MaxCompute.
Pour en savoir plus sur les ressources MaxCompute, consultez la rubrique Ressources.
Exemple de code UDTF
Le code suivant illustre l'implémentation de l'UDTF Java.
|
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
Dans MaxCompute Studio, créez une classe Java UDTF nommée
UDTFResourceen utilisant le code fourni dans la section Exemple de code UDTF.-
Configurez les paramètres d'exécution en fonction du contenu de la ressource warehouse du module Java MaxCompute.
RemarqueLes 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).

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


Tests côté client
-
Dans le coin supérieur gauche d'IDEA, cliquez sur
Project Explorer, puis sélectionnez
Add Resource.
-
Ajoutez le fichier file_resource.txt en vous basant sur les informations de votre instance MaxCompute.

-
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'); -
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.

Ajoutez la ressource wc_in2.

-
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 requisesfile_resource.txt,table_resource1ettable_resource2dans la section Extra resources.
-
Cliquez sur
Project 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.

Voici un exemple de commande :
SELECT my_udtf("10","20") AS (a, b, fileResourceLineCount);