このトピックでは、Javaユーザー定義関数 (UDF) またはPython UDFを使用して、キーと値のペア文字列の特定のキーに対応する値を取得する方法について説明します。 キーまたは値には区切り文字があります。
説明
この例では、UDF_EXTRACT_KEY_VALUE_WITH_SPLITという名前のUDFが登録されています。 次のセクションでは、関数の構文と入力パラメーターについて説明します。
string UDF_EXTRACT_KEY_VALUE_WITH_SPLIT(string <s>, string <split1>, string <split2>, string <keyname>)
関数の説明: この関数は、split1で指定された区切り文字を使用してsで指定された文字列からキーと値のペアを取得し、split2で指定された区切り文字を使用してキーと値を取得します。 次に、keynameで指定されたkeyに対応する値が返されます。 区切り文字がない文字列の値を取得するために使用されるUDFとは異なり、このUDFは、キーまたは値に区切り文字がある文字列に適用されます。
パラメーター:
s: 分割する文字列で、string型です。 This parameter is required.
split1: キーと値のペアを取得するために使用する文字列区切り文字で、string型です。 This parameter is required.
split2: キーと値を取得するために使用するキー /値の区切り文字で、STRING型です。 This parameter is required.
keyname: 値を取得するキーで、STRING型です。 This parameter is required.
開発と使用手順
1. UDFを書く
Java UDFのサンプルコード
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;
}
}
Java UDFを記述する場合は、UDFクラスを継承する必要があります。 この例では、evaluateメソッドは、STRING型の4つの入力パラメーターとSTRING型の戻り値を定義します。 入力パラメーターと戻り値のデータ型は、SQL文のUDFの関数シグネチャとして使用されます。 その他のコード仕様および要件については、「Java UDF」をご参照ください。
Python 3 UDFのサンプルコード
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):]
デフォルトでは、Python 2はMaxComputeプロジェクトでUDFを実行するために使用されます。 Python 3でUDFを実行する場合は、セッションレベルでset odps.sql.python.version=cp37
コマンドを実行します。 Python 3 UDF仕様の詳細については、「Python 3 UDF」をご参照ください。
Python 2 UDFのサンプルコード
#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):]
Python 2で記述されたUDFコードに漢字が表示される場合、UDFを実行するとエラーが返されます。 この問題に対処するには、コードのヘッダーにエンコード宣言を追加する必要があります。 宣言形式は、#coding: utf-8
または# -*- coding: utf-8 -*-
です。 2つの形式は同等です。 Python 2 UDF仕様の詳細については、「Python 2 UDF」をご参照ください。
2. リソースのアップロードとUDFの登録
UDFを記述してデバッグした後、UDFコードをMaxComputeにアップロードし、UDFを登録する必要があります。 この例では、UDF_EXTRACT_KEY_VALUE_WITH_SPLITという名前のUDFが登録されています。 Java UDFをアップロードおよび登録する方法の詳細については、「Javaプログラムのパッケージ化、パッケージのアップロード、MaxCompute UDFの作成」をご参照ください。 Python UDFのアップロードと登録方法の詳細については、「PythonプログラムのアップロードとMaxCompute UDFの作成」をご参照ください。
3. UDFを使用する
UDFを登録した後、次のコマンドを実行して、キーと値のペア文字列からキーnameに対応する値を取得します。 キーnameに対応する値には区切り文字が含まれます。
set odps.sql.python.version=cp37; -- If you want to use a Python 3 UDF, run this command.
SELECT UDF_EXTRACT_KEY_VALUE_WITH_SPLIT('name:zhangsang:man;age:2;', ';', ':', 'name');
次の応答が返されます。
+--------------+
| _c0 |
+--------------+
| zhangsan:man |
+--------------+