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 annotateifadesini içermelidir. Bu sayede MaxCompute, kodda tanımlanan işlev imzasını tanımlayabilir. UDF kodunda dosyalara veya tablolara başvurmak istiyorsanız koddafrom odps.distcache import get_cache_fileveyafrom odps.distcache import get_cache_tableifadeleri bulunmalıdır. -
İşlev imzası: Zorunludur.
Biçimi
@annotate(<signature>)şeklindedir; buradasignatureiş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.
-
evaluateyöntemi: Zorunludur.evaluateyö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.
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.
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
-
Ö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:
-
UDF kodunu yazın.
Project panelinde, MaxCompute Studio dizini altında scripts öğesine sağ tıklayın ve seçeneğini belirleyin.
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.
-
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"NotPython UDF'lerini yerel ortamda nasıl hata ayıklayacağınız hakkında bilgi için bkz. UDF'yi test etme.
-
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.
-
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
-
Ö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.
-
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" -
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:
-
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
-
Ö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.
-
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" -
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:
-
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_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 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.
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 belirtilenmodemodunda 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.modeparametresi bir STRING'dir. Varsayılan değer't'değeridir.modedeğerini't'olarak ayarlarsanız dosya metin modunda açılır.modedeğ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
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 tablo kaynağının içeriğini döndürür.resource_nameparametresi, 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.
NotBirden 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.