All Products
Search
Document Center

MaxCompute:Contoh UDF: Mengambil nilai dari string yang berisi pemisah

Last Updated:Mar 27, 2026

Ketika string pasangan kunci-nilai berisi karakter pembatas di dalam kuncinya atau nilainya, fungsi bawaan KEYVALUE tidak dapat menguraikannya dengan benar. Gunakan fungsi user-defined function (UDF) UDF_EXTRACT_KEY_VALUE_WITH_SPLIT untuk mengekstraksi nilai dari string tersebut.

Topik ini memandu Anda menulis UDF dalam Java atau Python, mendaftarkannya di MaxCompute, dan memanggilnya dalam SQL.

Langkah-langkah:

  1. Tulis UDF

  2. Unggah sumber daya dan daftarkan UDF

  3. Gunakan UDF

Signature fungsi

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

Fungsi ini membagi s menjadi pasangan kunci-nilai menggunakan split1, lalu membagi setiap pasangan menjadi kunci dan nilai menggunakan split2, dan mengembalikan nilai untuk kunci yang ditentukan oleh keyname.

Parameter (semua bertipe STRING, semua wajib):

Parameter Deskripsi
s String yang akan diurai
split1 Pembatas yang memisahkan pasangan kunci-nilai
split2 Pembatas yang memisahkan kunci dari nilai
keyname Kunci yang nilainya akan dikembalikan

Fungsi ini mengembalikan null jika salah satu parameter bernilai null atau jika kunci tidak ditemukan.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Proyek MaxCompute dengan izin pengembangan UDF

  • Lingkungan pengembangan Java atau Python untuk menulis dan menguji kode UDF

1. Tulis UDF

Pilih bahasa untuk implementasi UDF Anda. Ketiga implementasi menghasilkan output yang sama.

Java

package com.aliyun.rewrite; // Nama paket, yang bersifat user-defined.
import com.aliyun.odps.udf.UDF;

public class ExtractKeyValueWithSplit extends UDF{
    /**
     * Gunakan split1 untuk membagi string dan mendapatkan pasangan kunci-nilai. Kemudian, gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai.
     * @param str    String sumber.
     * @param split1  Pembatas yang digunakan untuk membagi string dan mendapatkan pasangan kunci-nilai.
     * @param split2  Pembatas yang digunakan untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai.
     * @param keyname Nama kunci yang nilainya ingin Anda peroleh.
     * @return Nilai yang dikembalikan.
     */
    public String evaluate(String str, String split1, String split2, String keyname) {
        if(str==null || split1==null || split2==null || keyname==null){
            return null;
        }
        try {
            // Gabungkan keyname dan split2.
            String keySplit = keyname + split2;

            // Telusuri string. Gunakan split1 untuk membagi string dan mendapatkan pasangan kunci-nilai.
            for(String subStr: str.split(split1)){
                // Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
                if (subStr.startsWith(keySplit)){
                    return subStr.substring(keySplit.length());
                }
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }
}

UDF Java harus memperluas kelas UDF. Metode evaluate menentukan signature fungsi yang digunakan dalam Pernyataan SQL: empat parameter input STRING dan nilai kembali STRING. Untuk spesifikasi kode lainnya, lihat Java UDFs.

Python 3

Penting

Proyek MaxCompute menjalankan Python 2 secara default. Untuk menggunakan UDF Python 3 ini, jalankan perintah berikut pada tingkat session sebelum memanggilnya: 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
        # Telusuri string. Gunakan split1 untuk membagi string dan mendapatkan pasangan kunci-nilai.
        for subStr in s.split(split1):
            # Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
            if subStr.startswith(key_split):
                return subStr[len(key_split):]

Untuk spesifikasi UDF Python 3, lihat Python 3 UDFs.

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
        # Telusuri string. Gunakan split1 untuk membagi string dan mendapatkan pasangan kunci-nilai.
        for subStr in s.split(split1):
            # Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
            if subStr.startswith(key_split):
                return subStr[len(key_split):]

Jika kode UDF Python 2 Anda berisi karakter Tionghoa, tambahkan deklarasi encoding di bagian atas file: #coding:utf-8 atau # -*- coding: utf-8 -*-. Tanpa deklarasi ini, MaxCompute akan mengembalikan error saat menjalankan UDF.

Untuk spesifikasi UDF Python 2, lihat Python 2 UDFs.

2. Unggah sumber daya dan daftarkan UDF

Setelah menulis dan menguji UDF Anda, unggah kodenya ke MaxCompute dan daftarkan sebagai UDF_EXTRACT_KEY_VALUE_WITH_SPLIT.

3. Gunakan UDF

Setelah mendaftarkan UDF, panggil dalam Pernyataan SQL. Contoh berikut mengekstraksi nilai untuk kunci name dari string di mana nilainya sendiri berisi pembatas :.

set odps.sql.python.version=cp37; -- Hanya diperlukan untuk UDF Python 3. Hilangkan baris ini untuk Java atau Python 2.
SELECT UDF_EXTRACT_KEY_VALUE_WITH_SPLIT('name:zhangsang:man;age:2;', ';', ':', 'name');

Dalam contoh ini:

  • split1 adalah ;, yang membagi string menjadi pasangan: name:zhangsang:man dan age:2

  • split2 adalah :, yang mengidentifikasi kunci melalui pencocokan awalan

  • Fungsi mengembalikan semua teks setelah name: pada pasangan pertama yang cocok

Output yang diharapkan:

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

Langkah selanjutnya