すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:例: 区切り文字を持つ文字列の値を取得する

最終更新日:Jan 06, 2025

このトピックでは、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 |
+--------------+