Utilisez une fonction définie par l'utilisateur (UDF) Python pour lire les données d'une ressource de table MaxCompute au moment de la requête. Cette rubrique détaille le processus complet : écriture de l'UDF, chargement des ressources, enregistrement de la fonction et appel dans une instruction SQL.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Installé et configuré le client MaxCompute. Pour les instructions d'installation, consultez Installation et configuration du client MaxCompute
Enregistré la table cible en tant que ressource dans votre projet MaxCompute. Pour les instructions, consultez Ajout de ressources
Dans cette rubrique, l'exemple utilise la table udf_test comme ressource de table enregistrée. La table contient les données suivantes :
+------+------+
| col1 | col2 |
+------+------+
| 1 | a |
| 2 | b |
| 4 | c |
| 5 | d |
+------+------+
Fonctionnement
La méthode get_cache_table() charge les données de la table en mémoire une seule fois lors de l'initialisation de la classe UDF. Chaque appel ultérieur à evaluate() lit depuis cet instantané en mémoire ; la table n'est pas relue pour chaque ligne. C'est pourquoi l'appel de chargement doit figurer dans __init__, et non dans evaluate().
Étape 1 : écrire l'UDF
L'UDF Python suivante lit toutes les lignes de udf_test en mémoire lors de l'initialisation, puis renvoie une ligne par appel à evaluate().
from odps.udf import annotate
from odps.distcache import get_cache_table
@annotate('->string')
class DistCacheTableExample(object):
def __init__(self):
self.records = list(get_cache_table('udf_test'))
self.counter = 0
self.ln = len(self.records)
def evaluate(self):
if self.counter > self.ln - 1:
return None
ret = self.records[self.counter]
self.counter += 1
return str(ret)
Enregistrez ce fichier sous le nom table.py dans le répertoire bin du client MaxCompute.
Étape 2 : charger les ressources et enregistrer l'UDF
Charger le script Python
Exécutez la commande suivante pour ajouter table.py en tant que ressource :
add py table.py;
Résultat attendu :
OK: Resource 'table.py' have been created.
Pour la liste complète des commandes de gestion des ressources, consultez Ajout de ressources.
Enregistrer l'UDF
Exécutez la commande suivante pour créer l'UDF :
create function table_udf as 'table.DistCacheTableExample' using 'table.py,udf_test';
| Paramètre | Description |
|---|---|
table_udf |
Nom de l'UDF. Il s'agit du nom utilisé dans les instructions SQL. |
table.DistCacheTableExample |
table correspond au nom de base du fichier de script (table.py). DistCacheTableExample est la classe définie dans ce script. |
Résultat attendu :
Success: Function 'table_udf' have been created.
Pour plus de détails sur l'enregistrement des UDF, consultez Création d'une UDF.
Étape 3 : appeler l'UDF
Créez une table de test, insérez des données et appelez l'UDF :
-- Create a test table
CREATE TABLE table_test (arg bigint);
-- Insert test data
INSERT INTO table_test VALUES (1), (4), (15), (123), (7995);
-- Call the UDF
SELECT table_udf() FROM table_test;
L'UDF est appelée une fois par ligne dans table_test. Étant donné que table_test comporte 5 lignes alors que udf_test n'en compte que 4, le cinquième appel renvoie NULL.
Résultat attendu :
+----------+
| _c0 |
+----------+
| (4, 'c') |
| (5, 'd') |
| (1, 'a') |
| (2, 'b') |
| NULL |
+----------+
Étapes suivantes
Pour lire les ressources de table MaxCompute à l'aide d'une fonction de table définie par l'utilisateur (UDTF) Java, consultez Utilisation d'une UDTF Java pour lire les ressources depuis MaxCompute.