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 :
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 |
|
|
La chaîne à analyser |
|
|
Le délimiteur qui sépare les paires clé-valeur |
|
|
Le délimiteur qui sépare les clés des valeurs |
|
|
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
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.
UDF Java : Consultez Empaqueter un programme Java, télécharger le package et créer une UDF MaxCompute.
UDF Python : Consultez Télécharger un programme Python et créer une UDF MaxCompute.
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 :
split1est;, ce qui divise la chaîne en paires :name:zhangsang:manetage:2split2est:, ce qui permet d'identifier la clé par correspondance de préfixeLa fonction renvoie tout ce qui suit
name:dans la première paire correspondante
Sortie attendue :
+--------------+
| _c0 |
+--------------+
| zhangsan:man |
+--------------+
Étapes suivantes
Pour analyser des chaînes clé-valeur dont les clés et les valeurs ne contiennent pas de délimiteurs, consultez Obtenir les valeurs de chaînes sans délimiteurs.
Pour en savoir plus sur le développement d'UDF, consultez UDF Java et UDF Python 3.