Tüm Ürünler
Search
Belge Merkezi

MaxCompute:UDF geliştirme (Python 3)

Son Güncelleme:Oct 04, 2026

MaxCompute, özel iş mantığını uygulamak üzere Python 3'te kullanıcı tanımlı işlevler (UDF) geliştirmeyi destekler.

UDF kod yapısı

Python 3'te bir UDF yazmak için MaxCompute Studio kullanabilirsiniz. Kod aşağıdaki bileşenleri içermelidir:

  • Modül içe aktarma: Zorunludur.

    UDF kodu, işlev imzasını içe aktarmak için kullanılan from odps.udf import annotate ifadesini içermelidir. Bu sayede MaxCompute, kodda tanımlanan işlev imzasını tanımlayabilir. UDF kodunda dosyalara veya tablolara başvurmak istiyorsanız kodda from odps.distcache import get_cache_file veya from odps.distcache import get_cache_table ifadeleri bulunmalıdır.

  • İşlev imzası: Zorunludur.

    Biçimi @annotate(<signature>) şeklindedir; burada signature işlevin giriş parametrelerinin ve dönüş değerinin veri türlerini tanımlar. İşlev imzaları hakkında daha fazla bilgi için bkz. İşlev imzaları ve veri türleri.

  • Özel Python sınıfı: Zorunludur.

    Sınıf, UDF kodunuzu düzenler ve iş mantığınızı uygulayan değişkenler ile yöntemleri tanımlar. Kodunuzda yerleşik üçüncü taraf bir kütüphaneye ya da dosya ve tablo kaynaklarına başvurabilirsiniz. Daha fazla bilgi için bkz. Üçüncü taraf kütüphanesi veya Kaynaklara başvurma.

  • evaluate yöntemi: Zorunludur.

    evaluate yöntemi özel Python sınıfında yer alır. evaluate yöntemi, UDF'nin giriş parametrelerini ve dönüş değerini tanımlar. Her Python sınıfı yalnızca bir evaluate yöntemi içerebilir.

Aşağıdaki kod bir UDF örneği sunar.

# Import the function signature module.
from odps.udf import annotate
# Define the function signature.
@annotate("bigint,bigint->bigint")
# Define the custom Python class.
class MyPlus(object):
# Implement the evaluate method.
    def evaluate(self, arg0, arg1):
        if None in (arg0, arg1):
            return None
        return arg0 + arg1

Sınırlamalar

  • UDF'ler kullanarak İnternet'e erişim

    Varsayılan olarak MaxCompute, UDF'ler kullanarak İnternet'e erişmenize izin vermez. UDF'ler aracılığıyla İnternet'e erişmek istiyorsanız iş gereksinimlerinize göre network connection application form doldurup başvuruyu gönderin. MaxCompute teknik destek ekibi ağ bağlantısını etkinleştirmek için sizinle hızla iletişime geçecektir. Ağ bağlantısı başvuru formunun nasıl doldurulacağı hakkında daha fazla bilgi için bkz. Ağ bağlantısı süreci.

  • UDF'ler kullanarak VPC'ye erişim

    Varsayılan olarak MaxCompute, UDF'ler kullanarak VPC'lerdeki kaynaklara erişmenize izin vermez. UDF'lerle bir VPC'deki kaynaklara erişmek için MaxCompute ile VPC arasında bir ağ bağlantısı kurmanız gerekir. İlgili işlemler hakkında daha fazla bilgi için bkz. UDF'den VPC kaynaklarına erişim.

  • UDF'ler, UDAF'ler veya UDTF'ler kullanarak tablo verilerini okuma

    UDF'ler, UDAF'ler veya UDTF'ler kullanarak aşağıdaki tablo türlerinden veri okuyamazsınız:

    • Şema evrimi gerçekleştirilen tablo

    • Karmaşık veri türleri içeren tablo

    • JSON veri türleri içeren tablo

    • İşlemsel tablo

Kullanım notları

Python 3, Python 2 ile uyumlu değildir ve ikisi aynı SQL ifadesinde kullanılamaz. Geçiş yapmadan önce uyumluluğu gözden geçirin.

Not

Python 2, 2020 yılının başında kullanım ömrünün sonuna (EOL) ulaşmıştır. Projelerinizi türlerine göre geçirmenizi öneririz.

UDF geliştirme: Genel iş akışı

UDF geliştirme; ortamı hazırlama, kod yazma, UDF'yi yükleme ve kaydetme ardından çağırma adımlarını içerir. Aşağıdaki bölümlerde bu iş akışı MaxCompute Studio, DataWorks ve odpscmd kullanılarak adım adım açıklanmaktadır.

MaxCompute Studio

  1. Ön koşullar

    Başlamadan önce MaxCompute Studio'yu yükleyin ve bir MaxCompute projesine bağlayın. Daha fazla bilgi için aşağıdaki konulara bakın:

    1. MaxCompute Studio'yu yükleme

    2. MaxCompute proje bağlantısı oluşturma

    3. Python geliştirme ortamını yapılandırma

  2. UDF kodunu yazın.

    1. Project panelinde, MaxCompute Studio dizini altında scripts öğesine sağ tıklayın ve New > MaxCompute Python seçeneğini belirleyin.

    2. Create new MaxCompute python class iletişim kutusunda Name alanına bir sınıf adı girin, tür olarak Python UDF seçeneğini belirleyin ve ardından OK düğmesine tıklayın.

    3. Düzenleyicide UDF kodunu yazın.

      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"
                  
      Not

      Python UDF'lerini yerel ortamda nasıl hata ayıklayacağınız hakkında bilgi için bkz. UDF'yi test etme.

  3. UDF'yi yükleyin ve kaydedin.

    Hedef Python programına sağ tıklayın ve Deploy to server… seçeneğini belirleyin. İşlev adını yapılandırın ve OK düğmesine tıklayın. Daha fazla bilgi için bkz. Dosya yükleme ve işlev kaydetme.

    Bu örnekte işlev adı UDF_GET_URL_CHAR olarak ayarlanır.

  4. UDF'yi çağırın.

    Sol gezinme bölmesinde Project Explore öğesine tıklayın. Hedef MaxCompute projesine sağ tıklayın, Open Console seçeneğini belirleyin, ardından UDF'yi çağırmak için SQL ifadesini girip çalıştırın.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

    Aşağıdaki sonuç döndürülür:

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

DataWorks

  1. Ön koşullar

    Başlamadan önce DataWorks'ü etkinleştirin ve bir MaxCompute projesiyle ilişkilendirin. Daha fazla bilgi için bkz. DataWorks kullanarak MaxCompute'a bağlanma.

  2. UDF kodunu yazın.

    UDF kodunu herhangi bir Python geliştirme aracında geliştirip paketleyebilirsiniz. Aşağıdaki kod bir örnektir.

    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. UDF'yi yükleyin ve kaydedin.

    Paketlenmiş kodu yükleyin ve UDF'yi DataWorks'te kaydedin. Daha fazla bilgi için aşağıdaki konulara bakın:

    1. MaxCompute kaynakları oluşturma ve kullanma

    2. Kullanıcı tanımlı işlev oluşturma ve kullanma

  4. UDF'yi çağırın.

    UDF'yi kaydettikten sonra UDF'yi çağıran SQL ifadelerini yazıp çalıştırmak için bir ODPS SQL düğümü oluşturun. ODPS SQL düğümleri hakkında daha fazla bilgi için bkz. ODPS SQL görevi geliştirme. Aşağıdaki kod SQL ifadesi için bir örnek sunar.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

odpscmd

  1. Ön koşullar

    odpscmd'yi indirip yükleyin, ardından bir MaxCompute projesine bağlanmak için config dosyasını yapılandırın. Daha fazla bilgi için bkz. MaxCompute istemcisi (odpscmd) kullanarak bağlanma.

  2. UDF kodunu yazın.

    UDF kodunu herhangi bir Python geliştirme aracında geliştirip paketleyebilirsiniz. Aşağıdaki kod bir örnektir.

    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. UDF'yi yükleyin ve kaydedin.

    Paketlenmiş kodu yükleyin ve UDF'yi odpscmd kullanarak kaydedin. Daha fazla bilgi için aşağıdaki konulara bakın:

    1. ADD PY

    2. CREATE FUNCTION

  4. UDF'yi çağırın.

    UDF'yi kaydettikten sonra çağırmak için bir SQL ifadesi yazıp çalıştırın.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

NumPy kütüphanesini yükleme

Yerleşik Python 3 çalışma zamanı ortamı NumPy içermez. UDF'niz NumPy gerektiriyorsa WHEEL paketini manuel olarak yükleyin. Paketi PyPI'den veya bir yansıtma sitesinden indirdiğinizde dosya adı numpy-<version>-cp37-cp37m-manylinux1_x86_64.whl formatındadır. Paket yükleme hakkında daha fazla bilgi için bkz. Kaynak işlemleri veya Python UDF'de üçüncü taraf paketi kullanma.

Python 3'ün desteklediği standart kütüphanelerin listesi için bkz. Python 3 standart kütüphanesi.

İşlev imzaları ve veri türleri

İşlev imzalarının biçimi:

@annotate(<signature>)

signature parametresi, giriş parametrelerinin ve dönüş değerinin veri türlerini belirten bir dizedir. Bir UDF çalıştırdığınızda UDF'nin giriş parametrelerinin ve dönüş değerinin veri türleri, işlev imzasında belirtilen veri türleriyle tutarlı olmalıdır. Veri türü tutarlılığı anlamsal ayrıştırma sırasında denetlenir. Veri türleri tutarsızsa bir hata döndürülür. İmza biçimi:

'arg_type_list -> type'

Parametre açıklaması:

  • arg_type_list: Giriş parametrelerinin veri türlerini belirtir. Birden fazla giriş parametresi varsa veri türleri virgül (,) ile ayrılır. Aşağıdaki veri türleri desteklenir: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale), CHAR ve VARCHAR. ARRAY, MAP ve STRUCT gibi karmaşık veri türleri ile iç içe geçmiş karmaşık veri türleri de desteklenir.

    arg_type_list bir yıldız işareti (*) ile temsil edilebilir veya boş bırakılabilir ('').

    • arg_type_list bir yıldız işareti (*) ile temsil edilirse rastgele sayıda giriş parametresine izin verilir.

    • arg_type_list boş bırakılırsa ('') giriş parametresi kullanılmaz.

  • type: Dönüş değerinin veri türünü belirtir. Bir UDF için yalnızca bir sütun değer döndürülür. Aşağıdaki veri türleri desteklenir: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE ve DECIMAL(precision,scale). ARRAY, MAP ve STRUCT gibi karmaşık veri türleri ile iç içe geçmiş karmaşık veri türleri de desteklenir.

Not

UDF kodunu yazarken MaxCompute projenizin kullandığı MaxCompute veri türü sürümüne göre bir veri türü seçebilirsiniz. MaxCompute veri türü sürümleri ve her sürümde desteklenen veri türleri hakkında daha fazla bilgi için bkz. Veri türü sürümleri.

Aşağıdaki tabloda geçerli işlev imzalarına örnekler verilmiştir.


İşlev imzası


Açıklama


'bigint,double->string'


Giriş parametrelerinin veri türleri BIGINT ve DOUBLE, dönüş değerinin veri türü ise STRING'dir.


'*->string'


Rastgele sayıda giriş parametresi kullanılır ve dönüş değerinin veri türü STRING'dir.


'->double'


Giriş parametresi kullanılmaz ve dönüş değerinin veri türü DOUBLE'dır.


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


Giriş parametrelerinin veri türü ARRAY<BIGINT>, dönüş değerinin veri türü ise STRUCT<x:STRING, y:INT>'tir.


'->map<bigint, string>'


Giriş parametresi kullanılmaz ve dönüş değerinin veri türü MAP<BIGINT, STRING>'dir.

Aşağıdaki tabloda MaxCompute SQL'de desteklenen veri türleri ile Python 2 veri türleri arasındaki eşlemeler açıklanmaktadır. Veri türlerinin tutarlılığını sağlamak için Python UDF'lerinizi bu eşlemelere göre yazmalısınız.


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 başvurma

Python 2 UDF kodunda dosyalara veya tablolara odps.distcache modülünü kullanarak başvurabilirsiniz.

  • odps.distcache.get_cache_file(resource_name, mode): Belirtilen dosya kaynağının içeriğini belirtilen mode modunda döndürür.

    • resource_name, MaxCompute projenizdeki mevcut bir tablonun adını belirten bir dizedir. Tablo adı geçersizse veya tablo yoksa bir hata döndürülür.

    • mode parametresi bir STRING'dir. Varsayılan değer 't' değeridir. mode değerini 't' olarak ayarlarsanız dosya metin modunda açılır. mode değerini 'b' olarak ayarlarsanız dosya ikili modda açılır.

    • Dönüş değeri dosya benzeri bir nesnedir. Bu nesne artık kullanılmıyorsa açık dosyayı serbest bırakmak için close yöntemini çağırmanız gerekir.

    Aşağıdaki kod bir dosyaya nasıl başvurulacağını gösterir.

    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): Belirtilen tablo kaynağının içeriğini döndürür.

    • resource_name parametresi, geçerli MaxCompute projesindeki mevcut bir tablo kaynağını belirtir. Kaynak adı geçersizse veya kaynak yoksa bir özel durum oluşturulur. Desteklenen veri türleri: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, FLOAT, CHAR, VARCHAR, BINARY, DATE, DECIMAL, ARRAY, MAP ve STRUCT.

    • Dönüş değeri bir Generator'dur. Her yinelemede bir tablo kaydı dizi olarak elde edilir.

Aşağıdaki kod bir tabloya nasıl başvurulacağını gösterir.

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)

UDF'leri çağırma

Bir Python 3 UDF'yi geliştirme iş akışını izleyerek geliştirdikten sonra MaxCompute SQL'de aşağıdaki gibi çağırabilirsiniz:

Python 3'ü etkinleştirme

Varsayılan olarak MaxCompute Python 2 kullanır. Python 3 kullanmak için SQL ifadenize aşağıdaki oturum bayrağını ekleyin.

set odps.sql.python.version=cp37;

İşlevi çağırma

  • Bir MaxCompute projesinde UDF kullanma: Yöntem, yerleşik işlevleri kullanmaya benzer. Kullanıcı tanımlı bir işlevi, yerleşik bir işlevi kullandığınız şekilde kullanabilirsiniz.

  • Projeler arası UDF kullanma: Proje A'da Proje B'nin UDF'sini kullanma. Aşağıdaki ifade bir örnektir: select B:udf_in_other_project(arg0, arg1) as res from table_t;. Projeler arası paylaşım hakkında daha fazla bilgi için bkz. Paketlere dayalı projeler arası kaynak erişimi.

Python 2 UDF'lerini geçirme

Python 2, 2020 yılının başında kullanım ömrünün sonuna (EOL) ulaşmıştır. Projelerinizi türlerine göre geçirmenizi öneririz:

  • Yeni projeler: Yeni MaxCompute projeleri veya ilk kez Python UDF yazdığınız projeler için tüm Python UDF'lerinde Python 3 kullanın.

  • Mevcut projeler: Çok sayıda Python 2 UDF içeren projelerde Python 3'ü etkinleştirirken dikkatli olun. Aşamalı geçiş yapmak için aşağıdaki yöntemleri kullanın:

    • Yeni işler ve yeni UDF'ler: UDF'leri yazmak için Python 3 kullanın ve Python 3'ü oturum düzeyinde etkinleştirin. Python 3'ü nasıl etkinleştireceğiniz hakkında daha fazla bilgi için bkz. Python 3'ü etkinleştirme.

    • Python 2 UDF'leri: Python 2 UDF'lerini hem Python 2 hem de Python 3 ile uyumlu olacak şekilde yeniden yazın. UDF'leri nasıl yeniden yazacağınız hakkında daha fazla bilgi için bkz. Python 2 Kodunu Python 3'e Taşıma.

      Not

      Birden fazla MaxCompute projesinde paylaşılan genel UDF'ler yazıyorsanız bunların hem Python 2 hem de Python 3 ile uyumlu olduğundan emin olun.

UDF örnekleri