Tous les produits
Search
Centre de documentation

MaxCompute:Exemple : Extraire une valeur d'une chaîne contenant un séparateur

Dernière mise à jour :Aug 10, 2026

Si une chaîne au format clé-valeur contient des délimiteurs dans ses clés ou ses valeurs, la fonction native KEYVALUE ne parvient pas à l'analyser correctement. Utilisez la fonction définie par l'utilisateur (UDF) UDF_EXTRACT_KEY_VALUE_WITH_SPLIT pour extraire les valeurs de ces chaînes.

Cette rubrique explique comment écrire l'UDF en Java ou en Python, l'enregistrer dans MaxCompute et l'appeler via SQL.

Étapes :

  1. Écrire l'UDF

  2. Télécharger les ressources et enregistrer l'UDF

  3. Utiliser l'UDF

Signature de la fonction

string UDF_EXTRACT_KEY_VALUE_WITH_SPLIT(string <s>, string <split1>, string <split2>, string <keyname>)

La fonction divise s en paires clé-valeur à l'aide de split1, puis sépare chaque paire en clé et valeur avec split2. Elle renvoie enfin la valeur associée à la clé spécifiée par keyname.

Paramètres (tous de type STRING, tous obligatoires) :

Paramètre

Description

s

La chaîne à analyser

split1

Le délimiteur qui sépare les paires clé-valeur

split2

Le délimiteur qui sépare les clés des valeurs

keyname

La clé dont il faut renvoyer la valeur

La fonction renvoie null si l'un des paramètres est null ou si la clé est introuvable.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un projet MaxCompute avec les autorisations de développement d'UDF

  • Un environnement de développement Java ou Python pour écrire et tester le code de l'UDF

1. Écrire l'UDF

Choisissez un langage pour implémenter votre UDF. Les trois implémentations produisent le même résultat.

Java

package com.aliyun.rewrite; // The package name, which is user-defined.
import com.aliyun.odps.udf.UDF;

public class ExtractKeyValueWithSplit extends UDF{
    /**
     * Use split1 to split the string and obtain key-value pairs. Then, use split2 to split the key-value pairs and obtain the keys and values.
     * @param str    The source string.
     * @param split1  The delimiter that is used to split a string and obtain key-value pairs.
     * @param split2  The delimiter that is used to split key-value pairs and obtain the keys and values.
     * @param keyname The name of the key whose value you want to obtain.
     * @return The returned value.
     */
    public String evaluate(String str, String split1, String split2, String keyname) {
        if(str==null || split1==null || split2==null || keyname==null){
            return null;
        }
        try {
            // Combine keyname and split2.
            String keySplit = keyname + split2;

            // Traverse the string. Use split1 to split the string and obtain key-value pairs.
            for(String subStr: str.split(split1)){
                // Use split2 to split the key-value pairs and obtain the keys and values. Then, obtain the value that corresponds to a specific key.
                if (subStr.startsWith(keySplit)){
                    return subStr.substring(keySplit.length());
                }
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }
}

L'UDF Java doit étendre la classe UDF. La méthode evaluate définit la signature de la fonction utilisée dans les instructions SQL : quatre paramètres d'entrée de type STRING et une valeur de retour de type STRING. Pour les autres spécifications de code, consultez UDF Java.

Python 3

Important

Les projets MaxCompute exécutent Python 2 par défaut. Pour utiliser cette UDF Python 3, exécutez la commande suivante au niveau de la session avant de l'appeler : set odps.sql.python.version=cp37.

from odps.udf import annotate


@annotate("string,string,string,string->string")
class ExtractKeyValueWithSplit(object):
    def evaluate(self, s, split1, split2, keyname):
        if not s:
            return None
        key_split = keyname + split2
        # Traverse the string. Use split1 to split the string and obtain key-value pairs.
        for subStr in s.split(split1):
            # Use split2 to split the key-value pairs and obtain the keys and values. Then, obtain the value that corresponds to a specific key.
            if subStr.startswith(key_split):
                return subStr[len(key_split):]

Pour les spécifications des UDF Python 3, consultez UDF Python 3.

Python 2

#coding:utf-8
from odps.udf import annotate


@annotate("string,string,string,string->string")
class ExtractKeyValueWithSplit(object):
    def evaluate(self, s, split1, split2, keyname):
        if not s:
            return None
        key_split = keyname + split2
        # Traverse the string. Use split1 to split the string and obtain key-value pairs.
        for subStr in s.split(split1):
            # Use split2 to split the key-value pairs and obtain the keys and values. Then, obtain the value that corresponds to a specific key.
            if subStr.startswith(key_split):
                return subStr[len(key_split):]

Si votre code d'UDF Python 2 contient des caractères chinois, ajoutez une déclaration d'encodage en haut du fichier : #coding:utf-8 ou # -*- coding: utf-8 -*-. Sans cette déclaration, MaxCompute renvoie une erreur lors de l'exécution de l'UDF.

Pour les spécifications des UDF Python 2, consultez UDF Python 2.

2. Télécharger les ressources et enregistrer l'UDF

Après avoir écrit et testé votre UDF, téléchargez le code vers MaxCompute et enregistrez-le sous le nom UDF_EXTRACT_KEY_VALUE_WITH_SPLIT.

3. Utiliser l'UDF

Une fois l'UDF enregistrée, appelez-la dans une instruction SQL. L'exemple suivant extrait la valeur de la clé name à partir d'une chaîne où la valeur elle-même contient le délimiteur :.

set odps.sql.python.version=cp37; -- Required only for the Python 3 UDF. Omit this line for Java or Python 2.
SELECT UDF_EXTRACT_KEY_VALUE_WITH_SPLIT('name:zhangsang:man;age:2;', ';', ':', 'name');

Dans cet exemple :

  • split1 est ;, ce qui divise la chaîne en paires : name:zhangsang:man et age:2

  • split2 est :, ce qui permet d'identifier la clé par correspondance de préfixe

  • La fonction renvoie tout ce qui suit name: dans la première paire correspondante

Sortie attendue :

+--------------+
| _c0          |
+--------------+
| zhangsan:man |
+--------------+

Étapes suivantes