Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Python 2'de UDF Geliştirme

Son Güncelleme:Oct 04, 2026

MaxCompute tarafından kullanılan Python 2 sürümü Python 2.7'dir. Bu konuda Python 2 ile kullanıcı tanımlı işlev (UDF) nasıl yazılacağı açıklanmaktadır.

UDF Kod Yapısı

Python 2'de UDF kodu yazmak için MaxCompute Studio kullanabilirsiniz. UDF kodu aşağıdaki öğeleri içerebilir:

  • Kodlama bildirimi: İsteğe bağlı.

    Bildirim biçimi #coding:utf-8 veya # -*- coding: utf-8 -*- şeklindedir. Her iki biçim de eşdeğerdir. Python 2 ile yazılan UDF kodunda Çince karakterler bulunursa UDF'yi çalıştırdığınızda hata alırsınız. Bu sorunu çözmek için kodun başına bir kodlama bildirimi eklemeniz gerekir.

  • Modül içeri aktarma: Zorunlu.

    UDF kodu, işlev imzasını içeri aktarmak için kullanılan from odps.udf import annotate ifadesini içermelidir. Böylece MaxCompute, kodda tanımlanan işlev imzasını tanımlayabilir. UDF kodunda dosyalara veya tablolara başvurmak istiyorsanız kod from odps.distcache import get_cache_file veya from odps.distcache import get_cache_table ifadelerini içermelidir.

  • İşlev imzası: Zorunlu.

    İşlev imzası @annotate(<signature>) biçimindedir. signature parametresi, UDF'nin 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ı: Zorunlu.

    Özel bir Python sınıfı, UDF kodunun yapı taşıdır. Bu sınıf, iş gereksinimlerinizi karşılamak için kullanılan değişkenleri ve yöntemleri tanımlar. UDF kodunda MaxCompute'a yüklü üçüncü taraf kitaplıklara başvurabilir veya dosya ve tablolara erişebilirsiniz. Daha fazla bilgi için bkz. Üçüncü taraf kitaplıklar veya Kaynaklara başvurma.

  • evaluate yöntemi: Zorunlu.

    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.

Örnek kod:

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

Sınırlamalar

MaxCompute, Python 2.7 ile Python 2 UDF'leri yazmanıza ve UDF kodunu bir korumalı alan ortamında çalıştırmanıza olanak tanır. Bu ortamda aşağıdaki işlemler yasaktır:

  • Yerel dosyalardan veri okuma ve bu dosyalara veri yazma.

  • Alt işlem başlatma.

  • İş parçacığı başlatma.

  • Soket iletişimini etkinleştirme.

  • Diğer sistemleri kullanarak Python 2 UDF'lerini çağırma.

Bu sınırlamalar nedeniyle yüklediğiniz kod Python standart kitaplıkları kullanılarak yazılmalıdır. Yukarıdaki işlemler Python standart kitaplıklarındaki modülleri veya C genişletme modüllerini içeriyorsa bu modüller kullanılamaz. Python standart kitaplıklarındaki modüllerle ilgili aşağıdaki noktalara dikkat edin:

  • Python standart kitaplıklarına dayalı olarak uygulanan ve genişletme modüllerine bağımlı olmayan tüm modüller kullanılabilir.

  • Aşağıdaki C genişletme modülleri kullanılabilir:

    • array ve audioop

    • binascii ve bisect

    • cmath, _codecs_cn, _codecs_hk, _codecs_iso2022, _codecs_jp, _codecs_kr, _codecs_tw, _collections ve cStringIO

    • datetime

    • _functools ve future_builtins

    • _heapq ve _hashlib

    • itertools

    • _json

    • _locale ve _lsprof

    • math, _md5 ve _multibytecodec

    • operator

    • _random

    • _sha256, _sha512, _sha, _struct ve strop

    • time

    • unicodedata

    • _weakref

    • cPickle

  • UDF kodunu korumalı alan ortamında çalıştırdığınızda standart çıktıya (sys.stdout) veya standart hata çıktısına (sys.stderr) yazılabilecek maksimum veri boyutu 20 KB'dır. Boyut 20 KB'yi aşarsa ekstra karakterler yoksayılır.

Üçüncü taraf kitaplıklar

NumPy gibi üçüncü taraf kitaplıklar, standart kitaplıklara ek olarak MaxCompute'ın Python 2 ortamına yüklenmiştir.

Not

Üçüncü taraf kitaplıkların kullanımı bazı sınırlamalara tabidir. Örneğin, üçüncü taraf bir kitaplık kullanırken yerel verilere erişemezsiniz ve yalnızca sınırlı ağ G/Ç kaynaklarını kullanabilirsiniz. Üçüncü taraf kitaplıklardaki ilgili API'ler devre dışı bırakılmıştır.

İş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'yi ç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 kontrol edilir. Veri türleri tutarlı değilse 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 çok giriş parametresi kullanılıyorsa veri türleri virgülle (,) ayrılır. Aşağıdaki veri türleri desteklenir: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(hassasiyet,ölçek), CHAR ve VARCHAR. ARRAY, MAP ve STRUCT gibi karmaşık veri türleri ve 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 değer sütunu döndürülür. Aşağıdaki veri türleri desteklenir: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE ve DECIMAL(hassasiyet,ölçek). ARRAY, MAP ve STRUCT gibi karmaşık veri türleri ve iç içe geçmiş karmaşık veri türleri de desteklenir.

Not

UDF kodu 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> ve dönüş değerinin veri türü STRUCT<x:STRING, y:INT>'tir.


'->map<bigint, string>'


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

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'lerini bu eşlemelere göre yazmanız gerekir.


MaxCompute SQL veri türü


Python 2 veri türü


BIGINT


INT


STRING


STR


DOUBLE


FLOAT


BOOLEAN


BOOL


DATETIME


INT


FLOAT


FLOAT


CHAR


STR


VARCHAR


STR


BINARY


BYTEARRAY


DATE


INT


DECIMAL


DECIMAL.DECIMAL


ARRAY


LIST


MAP


DICT


STRUCT


COLLECTIONS.NAMEDTUPLE

Not
  • MaxCompute SQL'de desteklenen DATETIME türü, Python veri türü INT ile eşlenir. INT türündeki bir değer, 1 Ocak 1970 Perşembe günü saat 00:00:00'dan itibaren geçen milisaniye sayısını ifade eden UNIX biçimini takip eder. DATETIME türündeki verileri Python standart kitaplıklarındaki DATETIME modülünü kullanarak işleyebilirsiniz.

  • odps.udf.int(value) ifadesine silent parametresi eklenmiştir. silent parametresi True olarak ayarlanırsa ve value öğesinin veri türü INT türüne dönüştürülemezse None döndürülür ve hata döndürülmez.

  • MaxCompute SQL'deki NULL değeri, Python 2'deki None ile eşlenir.

Kaynaklara başvurma

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

  • odps.distcache.get_cache_file(resource_name): Belirtilen bir dosyanın içeriğini döndürür.

    • resource_name, MaxCompute projenizdeki mevcut bir dosyanın adını belirten bir dizedir. Dosya adı geçersizse veya dosya mevcut değilse hata döndürülür.

      Not

      UDF kodunda bir dosyaya başvurmak için UDF'yi oluştururken dosyayı bildirmeniz gerekir. Aksi takdirde UDF'yi çağırdığınızda hata döndürü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 bir tablonun içeriğini döndürür.

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

    • Dönüş değeri GENERATOR veri türündedir. Çağıran, tablo içeriğini elde etmek için tabloyu tarar. Çağıran her seferinde tabloyu taradığında ARRAY türünde bir kayıt 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)

Geliştirme süreci

Bir UDF geliştirirken hazırlık yapmanız, UDF kodu yazmanız, Python programını yüklemeniz, UDF'yi oluşturmanız, UDF'yi hata ayıklamanız ve UDF'yi çağırmanız gerekir. MaxCompute, MaxCompute Studio, DataWorks ve MaxCompute istemcisi (odpscmd) gibi çeşitli araçları kullanarak UDF geliştirmenize olanak tanır.

  • Python 2'de UDF'leri geliştirmek için çeşitli araçların kullanılması süreci, Python 3'te UDF'leri geliştirme süreciyle aynıdır. Python'da UDF geliştirme süreci ve örnekleri hakkında daha fazla bilgi için bkz. Geliştirme süreci.

  • Python 2'de UDF geliştirmek ve çağırmak için MaxCompute Studio'nun nasıl kullanılacağı hakkında daha fazla bilgi için bkz. Python UDF Geliştirme.

Kullanım notları

Python 2 UDF'sini geliştirdikten sonra bu UDF'yi çağırmak için MaxCompute SQL kullanabilirsiniz. Python 2 UDF'sini aşağıdaki yöntemlerden birini kullanarak çağırabilirsiniz:

  • 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ında UDF kullanma: Proje B'deki bir UDF'yi Proje A'da kullanın. Aşağıdaki ifade bir örneği gösterir: 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.