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-8veya# -*- 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 annotateifadesini içermelidir. Böylece MaxCompute, kodda tanımlanan işlev imzasını tanımlayabilir. UDF kodunda dosyalara veya tablolara başvurmak istiyorsanız kodfrom odps.distcache import get_cache_fileveyafrom odps.distcache import get_cache_tableifadelerini içermelidir. -
İşlev imzası: Zorunlu.
İşlev imzası
@annotate(<signature>)biçimindedir.signatureparametresi, 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.
-
evaluateyöntemi: Zorunlu.Evaluate yöntemi özel Python sınıfında yer alır.
evaluateyöntemi, UDF'nin giriş parametrelerini ve dönüş değerini tanımlar. Her Python sınıfı yalnızca birevaluateyö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.
Üçü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_listbir yıldız işareti (*) ile temsil edilebilir veya boş bırakılabilir ('').arg_type_listbir yıldız işareti (*) ile temsil edilirse rastgele sayıda giriş parametresine izin verilir.arg_type_listboş 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.
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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'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)ifadesinesilentparametresi eklenmiştir.silentparametresi True olarak ayarlanırsa vevalueöğ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.NotUDF 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
closeyö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.