Sorgu sırasında bir MaxCompute tablo kaynağından veri okumak için Python kullanıcı tanımlı işlevi (UDF) kullanın. Bu konu; UDF'yi yazma, kaynakları yükleme, işlevi kaydetme ve SQL içinde çağırma adımlarını içeren tam iş akışını adım adım açıklar.
Önkoşullar
Başlamadan önce aşağıdaki koşulları karşıladığınızdan emin olun:
MaxCompute istemcisi yüklü ve yapılandırılmış olmalıdır. Kurulum talimatları için bkz. MaxCompute istemcisini yükleme ve yapılandırma
Hedef tablo, MaxCompute projenizde kaynak olarak kaydedilmiş olmalıdır. Talimatlar için bkz. Kaynak ekleme
Bu konuda örnek olarak udf_test tablosu kayıtlı tablo kaynağı olarak kullanılır. Tablo aşağıdaki verileri içerir:
+------+------+
| col1 | col2 |
+------+------+
| 1 | a |
| 2 | b |
| 4 | c |
| 5 | d |
+------+------+
Çalışma mantığı
get_cache_table() yöntemi, UDF sınıfı başlatıldığında tablo verilerini belleğe bir kez yükler. Sonraki her evaluate() çağrısı bu bellek içi anlık görüntüsünden okuma yapar; tablo her satır için yeniden okunmaz. Bu nedenle yükleme çağrısı __init__ içinde yer almalı, evaluate() içinde olmamalıdır.
Adım 1: UDF'yi yazma
Aşağıdaki Python UDF'si, başlatma sırasında udf_test içindeki tüm satırları belleğe yükler ve ardından her evaluate() çağrısında bir satır döndürür.
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)
Bu dosyayı MaxCompute istemcisinin bin dizininde table.py adıyla kaydedin.
Adım 2: Kaynakları yükleme ve UDF'yi kaydetme
Python betiğini yükleme
table.py dosyasını kaynak olarak eklemek için aşağıdaki komutu çalıştırın:
add py table.py;
Beklenen çıktı:
OK: Resource 'table.py' have been created.
Kaynak komutlarının tam listesi için bkz. Kaynak ekleme.
UDF'yi kaydetme
UDF'yi oluşturmak için aşağıdaki komutu çalıştırın:
create function table_udf as 'table.DistCacheTableExample' using 'table.py,udf_test';
| Parametre | Açıklama |
|---|---|
table_udf |
UDF'nin adı. SQL deyimlerinde çağırdığınız ad budur. |
table.DistCacheTableExample |
table betik dosyasının temel adıdır (table.py). DistCacheTableExample ise bu betikte tanımlanan sınıftır. |
Beklenen çıktı:
Success: Function 'table_udf' have been created.
UDF kaydı hakkında daha fazla ayrıntı için bkz. UDF oluşturma.
Adım 3: UDF'yi çağırma
Bir test tablosu oluşturun, veri ekleyin ve UDF'yi çağırın:
-- Create a test table
CREATE TABLE table_test (arg bigint);
-- Insert test data
INSERT INTO table_test VALUES (1), (4), (15), (123), (7995);
-- Call the UDF
SELECT table_udf() FROM table_test;
UDF, table_test içindeki her satır için bir kez çağrılır. table_test 5 satıra sahipken udf_test yalnızca 4 satır içerdiğinden beşinci çağrı NULL döndürür.
Beklenen çıktı:
+----------+
| _c0 |
+----------+
| (4, 'c') |
| (5, 'd') |
| (1, 'a') |
| (2, 'b') |
| NULL |
+----------+
Sırada ne var
Java kullanıcı tanımlı tablo değerli işlevi (UDTF) kullanarak MaxCompute tablo kaynaklarını okumak için bkz. Java UDTF kullanarak MaxCompute'dan kaynak okuma.