全部产品
Search
文档中心

MaxCompute:Kembangkan UDF dalam Python 3

更新时间:Nov 10, 2025

MaxCompute memungkinkan Anda menulis fungsi yang ditentukan pengguna (user-defined function/UDF) dalam Python 3 untuk memenuhi kebutuhan logika bisnis Anda. Topik ini menjelaskan cara menulis UDF dalam Python 3.

Struktur kode UDF

Anda dapat menggunakan MaxCompute Studio untuk menulis kode UDF dalam Python 3. Kode UDF harus berisi komponen-komponen berikut:

  • Impor modul: wajib.

    Kode UDF harus menyertakan from odps.udf import annotate, yang digunakan untuk mengimpor tanda tangan fungsi sehingga MaxCompute dapat mengenali tanda tangan fungsi yang didefinisikan dalam kode. Jika Anda ingin mereferensikan file atau tabel dalam kode UDF, kode tersebut harus menyertakan from odps.distcache import get_cache_file atau from odps.distcache import get_cache_table.

  • Tanda tangan fungsi: wajib.

    Tanda tangan fungsi menggunakan format @annotate(<signature>). Parameter signature mendefinisikan tipe data parameter input dan nilai kembali. Untuk informasi selengkapnya, lihat Tanda tangan fungsi dan tipe data.

  • Kelas Python kustom: wajib.

    Kelas Python kustom merupakan unit organisasi kode UDF dan mendefinisikan variabel serta metode yang digunakan untuk memenuhi kebutuhan bisnis Anda. Dalam kode UDF, Anda juga dapat mereferensikan pustaka pihak ketiga yang diinstal di MaxCompute atau mereferensikan file atau tabel. Untuk informasi selengkapnya, lihat Pustaka pihak ketiga atau Referensi sumber daya.

  • Metode evaluate: wajib.

    Metode evaluate terdapat dalam kelas Python kustom dan mendefinisikan parameter input serta nilai kembali dari UDF. Setiap kelas Python hanya dapat berisi satu metode evaluate.

Kode contoh:

# Impor modul tanda tangan fungsi.
from odps.udf import annotate
# Definisikan tanda tangan fungsi.
@annotate("bigint,bigint->bigint")
# Definisikan kelas Python kustom.
class MyPlus(object):
# Definisikan metode evaluate.
    def evaluate(self, arg0, arg1):
        if None in (arg0, arg1):
            return None
        return arg0 + arg1

Batasan

  • Akses Internet menggunakan UDF

    Secara default, MaxCompute tidak mengizinkan akses Internet melalui UDF. Jika Anda memerlukan akses Internet melalui UDF, lengkapi formulir aplikasi koneksi jaringan network connection application form sesuai kebutuhan bisnis Anda dan ajukan permohonan tersebut. Setelah disetujui, tim dukungan teknis MaxCompute akan menghubungi Anda untuk membantu membuat koneksi jaringan. Untuk informasi selengkapnya tentang cara mengisi formulir aplikasi koneksi jaringan, lihat Proses pengaktifan jaringan.

  • Akses VPC menggunakan UDF

    Secara default, MaxCompute tidak mengizinkan akses ke sumber daya di VPC melalui UDF. Untuk mengakses sumber daya di VPC menggunakan UDF, Anda harus membuat koneksi jaringan antara MaxCompute dan VPC tersebut. Untuk informasi selengkapnya tentang prosedur terkait, lihat Gunakan UDF untuk mengakses sumber daya di VPC.

  • Baca data tabel menggunakan UDF, UDAF, atau UDTF

    Anda tidak dapat menggunakan UDF, UDAF, atau UDTF untuk membaca data dari jenis tabel berikut:

    • Tabel yang telah menjalani evolusi skema

    • Tabel yang berisi tipe data kompleks

    • Tabel yang berisi tipe data JSON

    • Tabel transaksional

Perhatian

Python 3 tidak kompatibel dengan Python 2. Anda tidak dapat menggunakan kode Python 2 dan Python 3 secara bersamaan dalam pernyataan SQL yang sama.

Catatan

Python Software Foundation mengumumkan akhir masa pakai (EOL) untuk Python 2 pada awal tahun 2020. Kami menyarankan agar Anda memigrasikan UDF sesuai kebutuhan proyek Anda.

Proses pengembangan

Saat mengembangkan UDF, Anda harus melakukan persiapan, menulis kode UDF, mengunggah program Python, membuat UDF, men-debug UDF, dan memanggil UDF. MaxCompute mendukung berbagai alat pengembangan UDF, seperti MaxCompute Studio, DataWorks, dan klien MaxCompute (odpscmd). Bagian ini memberikan contoh pengembangan UDF menggunakan MaxCompute Studio, DataWorks, dan klien MaxCompute (odpscmd).

Gunakan MaxCompute Studio

  1. Lakukan persiapan.

    Sebelum menggunakan MaxCompute Studio untuk mengembangkan dan men-debug UDF, Anda harus menginstal MaxCompute Studio dan menghubungkannya ke proyek MaxCompute. Untuk informasi selengkapnya, lihat topik-topik berikut:

    1. Instal MaxCompute Studio

    2. Hubungkan ke proyek MaxCompute

    3. Konfigurasi lingkungan pengembangan Python

  2. Tulis kode UDF.

    1. Di bagian Project, klik kanan scripts di bawah modul MaxCompute script module dan pilih New > MaxCompute Python.

    2. Di kotak dialog Create new MaxCompute python class, masukkan nama kelas di kolom Name, pilih python UDF dari daftar drop-down Kind, lalu klik OK.

    3. Tulis kode UDF di editor kode.

      from odps.udf import annotate
      
      @annotate("string,bigint->string")
      class GetUrlChar(object):
      
          def evaluate(self, url, n):
              if n == 0:
                  return ""
              try:
                  index = url.find(".htm")
                  if index < 0:
                      return ""
                  a = url[:index]
                  index = a.rfind("/")
                  b = a[index + 1:]
                  c = b.split("-")
                  if len(c) < n:
                      return ""
                  return c[-n]
              except Exception:
                  return "Internal error"
      Catatan

      Untuk informasi tentang cara men-debug Fungsi yang Ditentukan Pengguna (UDF) Java secara lokal, lihat Tes UDF.

  3. Unggah program Python dan buat UDF.

    Klik kanan program Python yang diinginkan di folder scripts dan pilih Deploy to server…. Di kotak dialog Submit resource and register function, konfigurasikan nama fungsi lalu klik OK. Untuk informasi selengkapnya, lihat Unggah program Python dan buat UDF MaxCompute.

    Dalam contoh ini, nama fungsinya adalah UDF_GET_URL_CHAR.

  4. Panggil UDF.

    Di panel navigasi sebelah kiri, klik tab Project Explore. Klik kanan proyek MaxCompute tempat UDF tersebut berada, pilih Open Console, masukkan pernyataan SQL untuk memanggil UDF, lalu tekan Enter untuk menjalankannya. Contoh pernyataan:

    SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 bagi UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

    Hasil berikut dikembalikan:

    +-----+
    | _c0 |
    +-----+
    |  a  |
    +-----+

Gunakan DataWorks

  1. Lakukan persiapan.

    Sebelum menggunakan DataWorks untuk mengembangkan dan men-debug UDF, Anda harus mengaktifkan DataWorks dan mengaitkan ruang kerja DataWorks dengan proyek MaxCompute. Untuk informasi selengkapnya, lihat DataWorks.

  2. Tulis kode UDF.

    Anda dapat mengembangkan kode UDF di alat pengembangan Python apa pun lalu memaketkannya. Berikut ini adalah kode contoh.

    from odps.udf import annotate
    
    @annotate("string,bigint->string")
    class GetUrlChar(object):
    
        def evaluate(self, url, n):
            if n == 0:
                return ""
            try:
                index = url.find(".htm")
                if index < 0:
                    return ""
                a = url[:index]
                index = a.rfind("/")
                b = a[index + 1:]
                c = b.split("-")
                if len(c) < n:
                    return ""
                return c[-n]
            except Exception:
                return "Internal error"
  3. Unggah program Python dan buat UDF.

    Anda dapat mengunggah paket kode yang telah dipaket di konsol DataWorks dan membuat UDF. Untuk informasi selengkapnya, lihat topik-topik berikut:

    1. Buat dan gunakan sumber daya MaxCompute

    2. Membuat dan menggunakan fungsi yang ditentukan pengguna

  4. Panggil UDF.

    Setelah membuat UDF, Anda dapat membuat node ODPS SQL di konsol DataWorks. Tulis dan buat pernyataan SQL di node ODPS SQL untuk memanggil dan men-debug UDF. Untuk informasi selengkapnya tentang cara membuat node ODPS SQL, lihat Kembangkan tugas SQL MaxCompute. Contoh pernyataan:

    SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 bagi UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

Gunakan klien MaxCompute (odpscmd)

  1. Lakukan persiapan.

    Sebelum menggunakan klien MaxCompute untuk mengembangkan dan men-debug UDF, Anda harus mengunduh paket instalasi klien MaxCompute dari GitHub, menginstalnya, lalu mengonfigurasi file config agar terhubung ke proyek MaxCompute. Untuk informasi selengkapnya, lihat Klien MaxCompute (odpscmd).

  2. Tulis kode UDF.

    Anda dapat mengembangkan kode UDF di alat pengembangan Python apa pun lalu memaketkannya. Berikut ini adalah kode contoh.

    from odps.udf import annotate
    
    @annotate("string,bigint->string")
    class GetUrlChar(object):
    
        def evaluate(self, url, n):
            if n == 0:
                return ""
            try:
                index = url.find(".htm")
                if index < 0:
                    return ""
                a = url[:index]
                index = a.rfind("/")
                b = a[index + 1:]
                c = b.split("-")
                if len(c) < n:
                    return ""
                return c[-n]
            except Exception:
                return "Internal error"
  3. Unggah program Python dan buat UDF.

    Anda dapat mengunggah file JAR yang telah dipaket di klien MaxCompute dan membuat UDF. Untuk informasi selengkapnya, lihat topik-topik berikut:

    1. ADD PY

    2. CREATE FUNCTION

  4. Panggil UDF.

    Setelah membuat UDF, Anda dapat menulis dan membuat pernyataan SQL untuk memanggil dan men-debug UDF. Contoh:

    SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 bagi UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

Pengembangan UDF: menginstal pustaka pihak ketiga Numpy

Pustaka pihak ketiga NumPy tidak diinstal di lingkungan runtime Python 3 bawaan MaxCompute. Untuk menggunakan NumPy dalam UDF, Anda harus mengunggah secara manual paket WHEEL NumPy. Saat mengunduh paket NumPy dari PyPI atau mirror-nya, nama file paket tersebut adalah numpy-<nomor versi>-cp37-cp37m-manylinux1_x86_64.whl. Untuk informasi selengkapnya tentang cara mengunggah paket, lihat Operasi sumber daya atau Gunakan paket pihak ketiga dalam UDF Python.

Untuk informasi selengkapnya tentang pustaka standar yang didukung oleh Python 3, lihat The Python Standard Library.

Tanda tangan fungsi dan tipe data

Format tanda tangan fungsi:

@annotate(<signature>)

Parameter signature adalah string yang menentukan tipe data parameter input dan nilai kembali. Saat menjalankan UDF, tipe data parameter input dan nilai kembali UDF harus konsisten dengan tipe data yang ditentukan dalam tanda tangan fungsi. Konsistensi tipe data diperiksa selama penguraian semantik. Jika tipe data tidak konsisten, kesalahan akan dikembalikan. Format tanda tangan:

'arg_type_list -> type'

Deskripsi parameter:

  • arg_type_list: menentukan tipe data parameter input. Jika terdapat beberapa parameter input, tipe datanya dipisahkan dengan koma (,). Tipe data berikut didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(presisi,skala), CHAR, dan VARCHAR. Tipe data kompleks seperti ARRAY, MAP, dan STRUCT serta tipe data kompleks bersarang juga didukung.

    arg_type_list dapat direpresentasikan dengan tanda bintang (*) atau dibiarkan kosong ('').

    • Jika arg_type_list direpresentasikan dengan tanda bintang (*), jumlah parameter input acak diperbolehkan.

    • Jika arg_type_list dibiarkan kosong (''), tidak ada parameter input yang digunakan.

  • type: menentukan tipe data nilai kembali. Untuk UDF, hanya satu kolom nilai yang dikembalikan. Tipe data berikut didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, dan DECIMAL(presisi,skala). Tipe data kompleks seperti ARRAY, MAP, dan STRUCT serta tipe data kompleks bersarang juga didukung.

Catatan

Saat menulis kode UDF, Anda dapat memilih tipe data berdasarkan edisi tipe data MaxCompute yang digunakan oleh proyek MaxCompute Anda. Untuk informasi selengkapnya tentang edisi tipe data MaxCompute dan tipe data yang didukung di setiap edisi, lihat Edisi tipe data.

Tabel berikut memberikan contoh tanda tangan fungsi yang valid.

Tanda tangan fungsi

Deskripsi

'bigint,double->string'

Tipe data parameter input adalah BIGINT dan DOUBLE, sedangkan tipe data nilai kembali adalah STRING.

'*->string'

Jumlah parameter input acak digunakan dan tipe data nilai kembali adalah STRING.

'->double'

Tidak ada parameter input yang digunakan dan tipe data nilai kembali adalah DOUBLE.

'array<bigint>->struct<x:string, y:int>'

Tipe data parameter input adalah ARRAY<BIGINT> dan tipe data nilai kembali adalah STRUCT<x:STRING, y:INT>.

'->map<bigint, string>'

Tidak ada parameter input yang digunakan dan tipe data nilai kembali adalah MAP<BIGINT, STRING>.

Tabel berikut menjelaskan pemetaan antara tipe data yang didukung di MaxCompute SQL dan tipe data Python 2. Anda harus menulis UDF Python berdasarkan pemetaan ini untuk memastikan konsistensi tipe data.

Tipe MaxCompute SQL

Tipe Python 3

BIGINT

INT

STRING

UNICODE

DOUBLE

FLOAT

BOOLEAN

BOOL

DATETIME

DATETIME.DATETIME

FLOAT

FLOAT

CHAR

UNICODE

VARCHAR

UNICODE

BINARY

BYTES

DATE

DATETIME.DATE

DECIMAL

DECIMAL.DECIMAL

ARRAY

LIST

MAP

DICT

STRUCT

COLLECTIONS.NAMEDTUPLE

Referensi sumber daya

Anda dapat mereferensikan file atau tabel dalam kode UDF Python 2 menggunakan modul odps.distcache.

  • odps.distcache.get_cache_file(resource_name, mode): Mengembalikan konten file sumber daya tertentu dalam mode yang ditentukan.

    • resource_name adalah string yang menentukan nama tabel yang ada di proyek MaxCompute Anda. Jika nama tabel tidak valid atau tabel tidak ada, kesalahan akan dikembalikan.

    • mode: STRING yang menentukan mode pembukaan. Nilai default-nya adalah 't'. Jika mode adalah 't', file dibuka dalam format teks. Jika mode adalah 'b', file dibuka dalam format biner.

    • Nilai kembali adalah objek bertipe file-like. Jika objek ini tidak lagi digunakan, Anda harus memanggil metode close untuk melepaskan file yang terbuka.

    Kode berikut menunjukkan cara mereferensikan file.

    from odps.udf import annotate
    from odps.distcache import get_cache_file
    @annotate('bigint->string')
    class DistCacheExample(object):
    def __init__(self):
        cache_file = get_cache_file('test_distcache.txt')
        kv = {}
        for line in cache_file:
            line = line.strip()
            if not line:
                continue
            k, v = line.split()
            kv[int(k)] = v
        cache_file.close()
        self.kv = kv
    def evaluate(self, arg):
        return self.kv.get(arg)
  • odps.distcache.get_cache_table(resource_name): Mengembalikan konten sumber daya tabel tertentu.

    • resource_name: Nama sumber daya tabel yang ada di proyek MaxCompute saat ini. Jika nama sumber daya tidak valid atau sumber daya tidak ada, pengecualian akan dikembalikan. Anda dapat membaca data bertipe BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, FLOAT, CHAR, VARCHAR, BINARY, DATE, DECIMAL, ARRAY, MAP, dan STRUCT dari tabel tersebut.

    • Nilai kembali bertipe GENERATOR. Pemanggil melakukan iterasi pada tabel untuk mendapatkan konten tabel. Catatan bertipe ARRAY diperoleh setiap kali pemanggil melakukan iterasi pada tabel.

Kode berikut menunjukkan cara mereferensikan tabel.

from odps.udf import annotate
from odps.distcache import get_cache_table
@annotate('->string')
class DistCacheTableExample(object):
    def __init__(self):
        self.records = list(get_cache_table('udf_test'))
        self.counter = 0
        self.ln = len(self.records)
    def evaluate(self):
        if self.counter > self.ln - 1:
            return None
        ret = self.records[self.counter]
        self.counter += 1
        return str(ret)

Catatan penggunaan

Setelah mengembangkan UDF Python 3, Anda dapat menggunakan MaxCompute SQL untuk memanggil UDF tersebut. Untuk informasi selengkapnya tentang cara memanggil UDF Python 3, lihat Proses pengembangan. Anda dapat memanggil UDF dalam Python 3 menggunakan salah satu metode berikut:

Aktifkan Python 3

Secara default, Python 2 digunakan untuk menulis UDF di proyek MaxCompute. Jika Anda ingin menulis UDF dalam Python 3, tambahkan perintah berikut sebelum pernyataan SQL yang ingin Anda jalankan, lalu kirim dan jalankan pernyataan tersebut.

set odps.sql.python.version=cp37;

Panggil UDF

  • Gunakan UDF di proyek MaxCompute: Caranya mirip dengan penggunaan fungsi bawaan.

  • Gunakan UDF lintas proyek: Gunakan UDF dari Proyek B di Proyek A. Pernyataan berikut menunjukkan contohnya: select B:udf_in_other_project(arg0, arg1) as res from table_t;. Untuk informasi selengkapnya tentang berbagi lintas proyek, lihat Akses sumber daya lintas proyek berdasarkan paket.

Porting UDF Python 2

Python Software Foundation mengumumkan EOL untuk Python 2 pada awal tahun 2020. Oleh karena itu, kami menyarankan agar Anda melakukan porting UDF Python 2.

  • Di proyek baru atau proyek yang sudah ada di mana Anda pertama kali menulis UDF dalam Python, kami menyarankan agar Anda menggunakan Python 3 untuk menulis semua UDF Python.

  • Di proyek yang sudah ada dengan banyak UDF Python 2, berhati-hatilah saat mengaktifkan Python 3. Jika Anda ingin mengganti UDF Python 2 dengan UDF Python 3, gunakan metode berikut:

    • Gunakan Python 3 untuk menulis UDF baru dan aktifkan Python 3 untuk pekerjaan baru pada tingkat sesi. Untuk informasi selengkapnya tentang cara mengaktifkan Python 3, lihat Aktifkan Python 3.

    • Menulis ulang UDF Python 2 dengan cara yang kompatibel dengan Python 2 dan Python 3. Untuk informasi selengkapnya tentang cara menulis ulang UDF, lihat Porting Python 2 Code to Python 3.

      Catatan

      Jika Anda ingin menulis UDF publik yang dibagikan di antara beberapa proyek, kami menyarankan agar Anda menggunakan UDF yang kompatibel dengan Python 2 dan Python 3.

Contoh pengembangan UDF