Kullanıcı tanımlı bir toplama işlevi (UDAF), birden çok giriş kaydını tek bir çıkış değerine eşler. Toplama mantığınızı karşılayan yerleşik bir toplama işlevi yoksa UDAF kullanın. MaxCompute, Java veya Python ile yazılan UDAF'leri destekler.
UDAF ne zaman kullanılır?
Yerleşik işlevler dağıtılmış işlem için optimize edilmiştir ve UDAF'lerden daha iyi performans gösterir. Kullanım durumunuzu karşılayan bir yerleşik işlev varsa onu kullanın.
Toplama mantığınız yerleşik işlevlerle ifade edilemiyorsa UDAF yazın. Buna örnek olarak özel istatistiksel modeller, alana özgü puanlama veya çok alanlı ağırlıklı toplamalar verilebilir.
UDAF türleri
| Tür | Dil | Çalışma Zamanı |
|---|---|---|
| Java UDAF | Java | JVM |
| Python 2 UDAF | Python | Python 2.7 |
| Python 3 UDAF | Python | CPython 3.7.3 |
Uygulama ayrıntıları için bkz. Java UDAF'leri, Python 2 UDAF ve Python 3 UDAF.
Geliştirme süreci
Java UDAF
Aşağıdaki şekil Java UDAF geliştirme iş akışını gösterir.

| Adım | Gerekli mi? | Açıklama | Platform | Referanslar |
|---|---|---|---|---|
| 1 | Hayır | POM dosyanıza odps-sdk-udf SDK bağımlılığını ekleyin. Örnek: <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency>. En son sürümü Maven depolarında arayın. |
IntelliJ IDEA (Maven) | — |
| 2 | Evet | UDAF'i yazın. | IntelliJ IDEA (Maven) ve MaxCompute Studio | Java'da UDF geliştirme |
| 3 | Evet | UDAF'i yerel makinenizde veya birim testleriyle hata ayıklayın. | — | — |
| 4 | Evet | Kodu bir JAR dosyasında paketleyin. | — | — |
| 5 | Evet | JAR dosyasını MaxCompute projenize kaynak olarak yükleyin. | MaxCompute istemcisi (odpscmd), MaxCompute Studio, DataWorks | MaxCompute istemcisi: Kaynak ekleme, UDF oluşturma; MaxCompute Studio: Java programını paketleme, paketi yükleme ve MaxCompute UDF oluşturma; DataWorks: MaxCompute kaynaklarını oluşturma ve kullanma, MaxCompute işlevi oluşturma ve kullanma |
| 6 | Evet | Yüklenen JAR dosyasına dayalı bir UDF oluşturun. | — | — |
| 7 | Hayır | UDAF'i bir sorguda çağırın. | — | — |
Python UDAF
Aşağıdaki şekil Python UDAF geliştirme iş akışını gösterir.

| Adım | Gerekli mi? | Açıklama | Platform | Referanslar |
|---|---|---|---|---|
| 1 | Evet | UDAF'i yazın. | MaxCompute Studio | Python UDF geliştirme |
| 2 | Evet | UDAF'i yerel makinenizde veya birim testleriyle hata ayıklayın. | — | — |
| 3 | Evet | Python dosyalarını ve gerekli tüm kaynakları (dosya kaynakları, tablo kaynakları, üçüncü taraf paketler) MaxCompute projenize yükleyin. | MaxCompute istemcisi (odpscmd), MaxCompute Studio, DataWorks | MaxCompute istemcisi: Kaynak ekleme, UDF oluşturma; MaxCompute Studio: Python programını yükleme ve MaxCompute UDF oluşturma; DataWorks: İşlevleri kaydetmek için kaynakları kullanma |
| 4 | Evet | Yüklenen Python dosyalarına veya gerekli kaynaklara dayalı bir UDF oluşturun. | — | — |
| 5 | Hayır | UDAF'i bir sorguda çağırın. | — | — |
Sınırlamalar
UDAF'ler İnternet'e erişemez. İnternet erişimini etkinleştirmek için ağ bağlantısı başvurusu gönderin. Onaylandıktan sonra MaxCompute teknik destek ekibi bağlantıyı kurmanıza yardımcı olur. Ayrıntılar için bkz. Ağ bağlantısı süreci.
Kullanım notları
Performans: Yerleşik işlevler UDAF'lerden daha iyi performans gösterir. Kullanım durumunuzu karşılayan bir yerleşik işlev varsa onu kullanın.
-
Bellek: UDAF kullanan bir SQL deyimi, büyük veri hacimleri veya veri çarpıklığı nedeniyle varsayılan bellek tahsisini aşarsa limiti artırmak için oturum düzeyinde aşağıdaki komutu çalıştırın:
set odps.sql.udf.joiner.jvm.memory=xxxx;Daha fazla bilgi için bkz. MaxCompute UDF'leri hakkında SSS.
Ad çakışması: Bir UDAF yerleşik bir işlevle aynı ada sahipse MaxCompute UDAF'i çağırır. Bunun yerine yerleşik işlevi çağırmak için başına
::önekini ekleyin. Örnek:select ::concat('ab', 'c');
UDAF çağırma
Aynı proje içinde: UDAF'i bir yerleşik işlevi çağırdığınız şekilde çağırın.
Projeler arasında: Proje adını önek olarak kullanın. Aşağıdaki örnek, A projesi içinden B projesindeki udf_in_other_project öğesini çağırır:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Projeler arası kaynak paylaşımı kurulumu için bkz. Paketlere dayalı projeler arası kaynak erişimi.