全部产品
Search
文档中心

MaxCompute:Contoh: Mengganti string menggunakan ekspresi reguler

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menjalankan Java UDF atau Python UDF untuk mengganti string menggunakan ekspresi reguler.

Deskripsi

Dalam contoh ini, sebuah UDF bernama UDF_REPLACE_BY_REGEXP dibuat.

  • Sintaks:

    string UDF_REPLACE_BY_REGEXP(string <s>, string <regex>, string <replacement>) 
  • Deskripsi:

    Mengganti string s dengan string replacement menggunakan ekspresi reguler regex. Dibandingkan dengan fungsi bawaan REGEXP_REPLACE dari MaxCompute, UDF ini memungkinkan penggunaan variabel dalam ekspresi reguler.

  • Parameter:

    • s: String sumber. Nilai parameter ini bertipe data STRING dan wajib diisi.

    • regex: Ekspresi reguler. Nilai parameter ini bertipe data STRING dan wajib diisi.

    • replacement: String yang menggantikan string sumber menggunakan ekspresi reguler. Nilai parameter ini bertipe data STRING dan wajib diisi.

Prosedur pengembangan dan penggunaan

1. Menulis UDF

Kode contoh Java UDF

package com.aliyun.rewrite; // Tentukan nama paket.
import com.aliyun.odps.udf.UDF;
import com.aliyun.odps.udf.annotation.UdfProperty;

import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@UdfProperty(isDeterministic=true)
public class ReplaceByRegExp extends UDF {
    /**
     * Ekspresi reguler dalam kueri terbaru, yang di-cache untuk menghindari kompilasi berulang kali.
     */
    private String lastRegex = "";
    private Pattern pattern = null;

    /**
     * @param s String sumber.
     * @param regex Ekspresi reguler.
     * @param replacement String yang menggantikan string sumber.
     */
    public String evaluate(String s, String regex, String replacement) {
        Objects.requireNonNull(s, "String sumber tidak boleh null");
        Objects.requireNonNull(regex, "Ekspresi reguler tidak boleh null");
        Objects.requireNonNull(replacement, "String yang menggantikan string sumber tidak boleh null");

        // Jika ekspresi reguler berubah, kompilasi ulang ekspresi reguler.
        if (!regex.equals(lastRegex)) {
            lastRegex = regex;
            pattern = Pattern.compile(regex);
        }
        Matcher m = pattern.matcher(s);
        StringBuffer sb = new StringBuffer();

        // Lakukan penggantian teks.
        while (m.find()) {
            m.appendReplacement(sb, replacement);
        }
        m.appendTail(sb);
        return sb.toString();
    }
}

Jika Anda menulis UDF dalam Java, Anda harus mewarisi kelas UDF. Dalam contoh ini, metode evaluate mendefinisikan tiga parameter input bertipe data STRING dan nilai balik bertipe data STRING. Tipe data parameter input dan nilai balik digunakan sebagai tanda tangan UDF dalam pernyataan SQL. Untuk informasi lebih lanjut tentang spesifikasi dan persyaratan kode lainnya, lihat Java UDFs.

Kode contoh Python 3 UDF

from odps.udf import annotate
import re

@annotate("string,string,string->string")
class ReplaceByRegExp(object):
    def __init__(self):
        self.lastRegex = ""
        self.pattern = None

    def evaluate(self, s, regex, replacement):
        if not s or not regex or not replacement:
            raise ValueError("Argumen dengan None")
        # Jika ekspresi reguler berubah, kompilasi ulang ekspresi reguler.
        if regex != self.lastRegex:
            self.lastRegex = regex
            self.pattern = re.compile(regex)
        result = self.pattern.sub(replacement, s)
        return result

Secara default, Python 2 digunakan untuk menjalankan UDF dalam proyek MaxCompute. Jika Anda ingin menjalankan UDF dalam Python 3, jalankan perintah berikut pada tingkat sesi: set odps.sql.python.version=cp37. Untuk informasi lebih lanjut tentang spesifikasi Python 3 UDF, lihat Python 3 UDFs.

Kode contoh Python 2 UDF

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

@annotate("string,string,string->string")
class ReplaceByRegExp(object):
    def __init__(self):
        self.lastRegex = ""
        self.pattern = None

    def evaluate(self, s, regex, replacement):
        if not s or not regex or not replacement:
            raise ValueError("Argumen dengan None")
        # Jika ekspresi reguler berubah, kompilasi ulang ekspresi reguler.
        if regex != self.lastRegex:
            self.lastRegex = regex
            self.pattern = re.compile(regex)
        result = self.pattern.sub(replacement, s)
        return result

Jika karakter Cina muncul dalam kode UDF yang ditulis dalam Python 2, kesalahan akan dikembalikan saat Anda menjalankan UDF. Untuk mengatasi masalah ini, tambahkan deklarasi pengkodean ke header kode. Format deklarasinya adalah #coding:utf-8 atau # -*- coding: utf-8 -*-. Kedua format tersebut setara. Untuk informasi lebih lanjut tentang spesifikasi Python 2 UDF, lihat Python 2 UDFs.

2. Unggah sumber daya dan buat UDF

Setelah mengembangkan dan men-debug kode UDF, unggah sumber daya ke MaxCompute dan buat UDF. Dalam contoh ini, sebuah UDF bernama UDF_REPLACE_BY_REGEXP dibuat. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat Java UDF, lihat Kemas program Java, unggah paket, dan buat MaxCompute UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat Python UDF, lihat Unggah program Python dan buat MaxCompute UDF.

3. Gunakan UDF

Setelah UDF dibuat, jalankan perintah berikut untuk mengganti semua digit dalam string dengan tanda pagar (#):

set odps.sql.python.version=cp37; -- Untuk menggunakan UDF dalam Python 3, jalankan perintah ini.
SELECT UDF_REPLACE_BY_REGEXP('abc 123 def 456', '\\d+', '#');

Hasil berikut dikembalikan:

+--------------+
| _c0          |
+--------------+
| abc # def #  |
+--------------+