Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Python 3 kullanıcı tanımlı tablo değerli işlev (UDTF)

Son Güncelleme:Oct 04, 2026

MaxCompute, CPython 3.7.3 kullanarak Python 3'ü destekler. Python 2'nin kullanım ömrü sona erdiğinden (EOL), yeni oluşturulan tüm kullanıcı tanımlı tablo değerli işlevleri (UDTF) Python 3 ile yazın.

Python 3'ü etkinleştirin

Varsayılan olarak MaxCompute projeleri UDF'ler için Python 2 kullanır. Python 3 kullanmak için SQL ifadenizden önce aşağıdaki oturum düzeyindeki komutu ekleyin ve ikisini birlikte gönderin:

set odps.sql.python.version=cp37;

UDTF kod yapısı

Python 3'te UDTF kodu yazmak için MaxCompute Studio aracını kullanın. Bir UDTF dört bileşenden oluşur:

Bileşen Gerekli mi? Açıklama
Modül içe aktarmaları Gerekli from odps.udf import annotate ve from odps.udf import BaseUDTF ifadelerini içermelidir. Dosya veya tabloları referans almak için from odps.distcache import get_cache_file ya da from odps.distcache import get_cache_table ekleyin.
İşlev imzası İsteğe bağlı @annotate(<signature>) ile bildirilir. Giriş parametrelerinin ve dönüş değerlerinin veri türlerini tanımlar. İmza belirtilmezse herhangi bir giriş veri türü kabul edilir ve tüm dönüş değerleri varsayılan olarak STRING olur.
Özel Python sınıfı Gerekli BaseUDTF sınıfından türetilmiş bir sınıftır. İş mantığınız için değişkenleri ve yöntemleri tanımlar.
Sınıf yöntemleri Gerekli Aşağıdaki tabloda açıklanan gerekli yöntemleri uygulayın.

Sınıf yöntemleri

Yöntem Gerekli mi? Ne zaman çağrılır? Açıklama
BaseUDTF.init() İsteğe bağlı İlk kayıttan önce, bir kez Başlatma yöntemidir. Geçersiz kılarken başlangıçta super(BaseUDTF, self).init() çağrısını yapın. Kayıtlar arasında kalıcı olan iç durumu ayarlamak için kullanın.
BaseUDTF.process([args, ...]) Gerekli Her SQL kaydı için bir kez Her giriş satırını işler. process işlevinin parametreleri, SQL ifadelerinde belirtilen UDTF giriş parametreleridir.
BaseUDTF.forward([args, ...]) Gerekli Kodunuz tarafından çağrılır Her çağrıda bir satır çıktılar. forward yöntemindeki parametreler, SQL ifadelerinde belirtilen UDTF çıkış parametreleridir. İşlev imzası yoksa forward çağırmadan önce tüm değerleri STRING'e dönüştürün.
BaseUDTF.close() İsteğe bağlı Son kayıttan önce, bir kez Temizleme yöntemidir. UDTF sonlandığında kaynakları serbest bırakmak için kullanın.

Aşağıdaki örnek, virgülle ayrılmış bir dizeyi tek tek satırlara bölen minimal bir UDTF göstermektedir:

# Import the function signature module and the base class.
from odps.udf import annotate
from odps.udf import BaseUDTF

# Function signature: takes a STRING, returns a STRING.
@annotate('string -> string')

# Custom Python class derived from BaseUDTF.
class Explode(BaseUDTF):

    def process(self, arg):
        props = arg.split(',')
        for p in props:
            self.forward(p)
Python 2 UDTF'leri ile Python 3 UDTF'leri farklı temel Python sürümlerinde çalışır. Her UDTF'yi hedeflediği Python sürümünün sözdizimi ve yeteneklerine göre yazın.

Sınırlamalar

Python 3, Python 2 ile uyumlu değildir. Tek bir SQL ifadesinde Python 2 UDTF'leri ile Python 3 UDTF'leri karıştırılamaz.

Python 2 UDTF'lerini geçirin

Python 2'nin kullanım ömrü sona ermiştir. Mevcut Python 2 UDTF'lerinizi proje durumunuza göre geçirin:

  • Yeni proje veya ilk Python UDTF: Tüm Python UDTF'lerini en baştan Python 3 ile yazın.

  • Çok sayıda Python 2 UDTF'i içeren mevcut proje: Kesintiyi önlemek için kademeli olarak geçiş yapın. Aşağıdaki yaklaşımlardan birini seçin:

    • Yeni UDTF'leri Python 3 ile yazın ve bu yeni UDTF'leri kullanan işler için Python 3'ü oturum düzeyinde etkinleştirin. Ayrıntılar için bkz. Python 3'ü etkinleştirin.

    • Mevcut Python 2 UDTF'lerini hem Python 2 hem de Python 3 ile uyumlu olacak şekilde yeniden yazın. Rehberlik için Python 2 Kodunu Python 3'e Taşıma konusuna bakın.

Bir UDTF birden fazla MaxCompute projesinde paylaşılıyorsa, Python 2 kullanan projelerin bozulmasını önlemek amacıyla işlevi hem Python 2 hem de Python 3 ile uyumlu hale getirin.

Üçüncü taraf kitaplıklar

NumPy, MaxCompute Python 3 çalışma zamanı ortamında bulunmaz. Bir UDTF'de NumPy kullanmak için bir NumPy wheel paketini kaynak olarak manuel şekilde yükleyin. Python Package Index (PyPI) veya bir görüntüden beklenen dosya adı şöyledir:

numpy-<Version>-cp37-cp37m-manylinux1_x86_64.whl

Paket yükleme talimatları için bkz. Kaynak işlemleri veya Python UDF'lerinde üçüncü taraf paketlere referans verme.

İşlev imzaları ve veri türleri

İşlev imzası, bir UDTF'nin giriş parametrelerinin ve dönüş değerlerinin veri türlerini bildirir. MaxCompute, semantik ayrıştırma sırasında imzayı doğrular ve gerçek türler eşleşmiyorsa hata döndürür.

İmza biçimi

@annotate('arg_type_list -> type_list')
  • arg_type_list: Virgülle ayrılmış giriş parametresi türleri. Herhangi bir sayıda parametre kabul etmek için * olarak ayarlayın veya parametre kabul etmemek için boş bırakın.

  • type_list: Dönüş değeri türleri. Bir UDTF birden fazla sütun döndürebilir.

type_list için desteklenen türler: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(hassasiyet,ölçek) ve karmaşık türler (ARRAY, MAP, STRUCT); iç içe geçmiş karmaşık türler dahil.

arg_type_list için desteklenen türler: Yukarıda listelenen tüm türlerin yanı sıra CHAR ve VARCHAR.

Veri türlerini MaxCompute projenizin veri türü sürümü temelinde seçin.

İmza örnekleri

İmza Açıklama
@annotate('bigint,boolean->string,datetime') İki giriş parametresi (BIGINT, BOOLEAN); iki dönüş değeri (STRING, DATETIME).
@annotate('*->string,datetime') Herhangi bir sayıda giriş parametresi; iki dönüş değeri (STRING, DATETIME).
@annotate('->double,bigint,string') Giriş parametresi yok; üç dönüş değeri (DOUBLE, BIGINT, STRING).
@annotate("array<string>,struct<a1:bigint,b1:string>,string->map<string,bigint>,struct<b1:bigint>") Karmaşık tür girişleri ve çıktıları.

Veri türü eşlemeleri

Python UDTF'lerini MaxCompute SQL türlerine karşılık gelen Python türlerini kullanarak yazın:

MaxCompute SQL türü Python 3 türü
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

Kaynaklara referans verme

Bir Python UDTF'de dosya ve tablolara odps.distcache modülünü kullanarak referans verin.

odps.distcache.get_cache_file(resource_name)

Bir dosya kaynağının içeriğini döndürür.

  • resource_name: MaxCompute projenizdeki mevcut bir dosya kaynağının adı. Ad geçersizse veya dosya yoksa hata döndürür.

  • Dosya benzeri bir nesne döndürür. İşiniz bittiğinde dosya tanıtıcısını serbest bırakmak için nesne üzerinde close() çağrısı yapın.

  • UDTF oluştururken dosya kaynağını bildirin. Bu bildirimi atlarsanız UDTF çağrıldığında hata döner.

odps.distcache.get_cache_table(resource_name)

Bir tablo kaynağının içeriğini döndürür.

  • resource_name: MaxCompute projenizdeki mevcut bir tablo kaynağının adı. Ad geçersizse veya tablo yoksa hata döndürür.

  • Bir oluşturucu (generator) döndürür. Üzerinde yineleme yapıldığında her satır için bir kayıt elde edilir; her kayıt bir ARRAY'dir.

Aşağıdaki örnek, bir JSON dosyasından ve bir tablo kaynağından veri okur, ardından bir arama işlemine dayalı olarak satırları çıktılar:

from odps.udf import annotate
from odps.udf import BaseUDTF
from odps.distcache import get_cache_file
from odps.distcache import get_cache_table

@annotate('string -> string, bigint')
class UDTFExample(BaseUDTF):

    def __init__(self):
        import json
        # Load the JSON file resource into a dict.
        cache_file = get_cache_file('test_json.txt')
        self.my_dict = json.load(cache_file)
        cache_file.close()

        # Append records from the table resource into the dict.
        records = list(get_cache_table('table_resource1'))
        for record in records:
            self.my_dict[record[0]] = record[1]

    def process(self, pageid):
        # For each input pageid, forward all associated adid values.
        for adid in self.my_dict[pageid]:
            self.forward(pageid, adid)

Python 3 UDTF çağırma

geliştirme sürecini izleyerek bir Python 3 UDTF geliştirdikten sonra bunu MaxCompute SQL'den çağırın.

MaxCompute Studio'da Python 3 UDTF geliştirmek ve test etmek için bkz. Python UDF geliştirme.