MaxCompute yerleşik işlevleri gereksinimlerinizi karşılamıyorsa, IntelliJ IDEA (Maven) gibi bir geliştirme aracı veya MaxCompute Studio ile Çalışmaya Başlama kullanarak Java dilinde bir kullanıcı tanımlı işlev (UDF) oluşturabilir ve ardından bu UDF'i MaxCompute SQL deyimlerinde çağırabilirsiniz.
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şmeniz gerekiyorsa, iş gereksinimlerinize göre ağ bağlantısı başvuru formunu doldurup başvurunuzu 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ü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 içindeki 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, UDAF veya UDTF Kullanarak Tablo Verilerini Okuma
UDF, UDAF veya UDTF'leri kullanarak aşağıdaki tablo türlerinden veri okuyamazsınız:
Şema evrimi uygulanan tablo
Karmaşık veri türleri içeren tablo
JSON veri türleri içeren tablo
İşlemsel tablo
Kullanım Notları
Bir Java UDF'i yazmadan önce UDF Kod Yapısı ve Java ile MaxCompute arasındaki veri türü eşlemeleri hakkında bilgi edinin. Daha fazla bilgi için bkz. Ek: Veri Türleri.
Java UDF'i yazarken aşağıdaki hususlara dikkat edin:
Farklı UDF JAR dosyalarında aynı ada sahip ancak mantığı farklı sınıfların bulunmasından kaçının. Örneğin, UDF1 ve UDF2 sırasıyla udf1.jar ve udf2.jar dosyalarına karşılık geliyorsa ve her iki JAR dosyası da farklı mantığa sahip
com.aliyun.UserFunction.classsınıfını içeriyorsa, aynı SQL deyimi içinde her iki UDF'in çağrılması MaxCompute'un sınıflardan birini rastgele yüklemesine neden olur. Bu durum beklenmeyen sonuçlara veya derleme hatasına yol açabilir.Bir Java UDF'inde giriş parametreleri ve dönüş değerleri ilkel türler (int ve long gibi) yerine nesne türleri (String ve Long gibi) kullanmalıdır.
SQL'deki NULL değerler Java'daki NULL değerlere karşılık gelir. Java ilkel türleri NULL değerleri temsil edemediği için kullanımlarına izin verilmez.
UDF Geliştirme İş Akışı
UDF geliştirmesi; ortam hazırlama, UDF kodu yazma, JAR dosyasını yükleme, UDF'i kaydetme ve hata ayıklama gibi birkaç adım içerir. Aşağıdaki bölümlerde bu iş akışı MaxCompute Studio, DataWorks ve odpscmd kullanılarak gösterilmektedir.
MaxCompute Studio Kullanma
Aşağıdaki örnekte, MaxCompute Studio kullanılarak karakterleri küçük harfe dönüştüren bir Java UDF'inin nasıl geliştirileceği ve çağrılacağı gösterilmektedir.
-
Ortamı hazırlayın.
MaxCompute Studio'da bir UDF geliştirmeden ve hata ayıklamadan önce MaxCompute Studio'yu yükleyip bir MaxCompute projesine bağlamanız gerekir. Daha fazla bilgi için aşağıdaki konulara bakın:
-
UDF kodunu yazın.
Project gezgininde modülün kaynak kodu dizinine () sağ tıklayın ve seçeneğini seçin.
-
Create new MaxCompute java class iletişim kutusunda UDF seçeneğine tıklayın, Name alanına bir sınıf adı girin ve Enter tuşuna basın.
Name, oluşturulacak MaxCompute Java sınıfının adını belirtir. Bir paket oluşturmadıysanız otomatik olarak oluşturmak için packagename.classname biçimini girin. Bu örnekte sınıfın adı Lower olarak belirlenmiştir.
-
Kod düzenleyicide UDF kodunu yazın. Örnek:
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } }NotJava UDF'ini yerel olarak hata ayıklamak için bkz. UDF'leri Geliştirme ve Hata Ayıklama.
-
UDF'i yükleyin ve kaydedin.
UDF Java dosyasına sağ tıklayın ve Deploy to server... seçeneğini seçin. Package a jar, submit resource and register function iletişim kutusunda parametreleri yapılandırın ve OK düğmesine tıklayın.
MaxCompute project: UDF'in ait olduğu MaxCompute projesi. UDF bağlı olan MaxCompute projesinde yazıldığından varsayılan değeri kullanabilirsiniz.
Resource file: UDF'in bağımlı olduğu kaynak dosyanın yolu. Varsayılan değeri kullanabilirsiniz.
Resource name: UDF'in bağımlı olduğu kaynak. Varsayılan değeri kullanabilirsiniz.
Function name: SQL deyimlerinde UDF'i çağırmak için kullanılan ad. Örneğin, Lower_test.
-
UDF'te hata ayıklayın.
Sol gezinme bölmesinde Project Explore seçeneğine tıklayın. Hedef MaxCompute projesine sağ tıklayın ve Open Console seçeneğini seçin. Konsolda UDF'i çağıran SQL deyimini girin ve Enter tuşuna basın. Örnek:
select lower_test('ABC');Aşağıdaki sonuç döner.
+-----+ | _c0 | +-----+ | abc | +-----+
DataWorks Kullanma
-
Ortamı hazırlayın.
DataWorks'te bir UDF geliştirmeden ve hata ayıklamadan önce DataWorks'ü etkinleştirip buna bir MaxCompute projesi bağlamanız gerekir. Daha fazla bilgi için bkz. DataWorks Kullanma.
-
UDF kodunu yazın.
UDF kodunu herhangi bir Java geliştirme aracında yazıp bir JAR dosyası olarak paketleyebilirsiniz. Örnek:
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
UDF'i yükleyin ve kaydedin.
Paketlenmiş kodu DataWorks'e yükleyip UDF'i kaydedebilirsiniz. Daha fazla bilgi için aşağıdaki konulara bakın:
-
UDF'te hata ayıklayın.
UDF'i kaydettikten sonra bir ODPS SQL düğümü oluşturun ve UDF'te hata ayıklamak için bu düğümde bir SQL deyimi çalıştırın. ODPS SQL düğümü oluşturma hakkında daha fazla bilgi için bkz. ODPS SQL Düğümü Oluşturma. Örnek:
select lower_test('ABC');
odpscmd Kullanma
-
Ortamı hazırlayın.
odpscmd kullanarak bir UDF geliştirmek ve hata ayıklamak için istemciyi yükleyip MaxCompute projesine bağlantısını yapılandırmanız gerekir. Daha fazla bilgi için bkz. MaxCompute İstemcisini (odpscmd) Kullanma.
-
UDF kodunu yazın.
UDF kodunu herhangi bir Java geliştirme aracında yazıp bir JAR dosyası olarak paketleyebilirsiniz. Örnek:
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
UDF'i yükleyin ve kaydedin.
Paketlenmiş kodu odpscmd kullanarak yükleyip UDF'i kaydedebilirsiniz. Daha fazla bilgi için bkz.:
-
UDF'te hata ayıklayın.
UDF'i kaydettikten sonra hata ayıklamak için bir SQL deyimi yazıp çalıştırın. Örnek:
select lower_test('ABC');
UDF'leri Çağırma
Bir Java UDF'ini UDF Geliştirme İş Akışı bölümünde açıklandığı şekilde geliştirdikten sonra MaxCompute SQL içinde çağırabilirsiniz. Aşağıdaki yöntemler kullanılabilir:
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: B Projesindeki bir UDF'i A Projesinde kullanma. Aşağıdaki deyim bir örneği göstermektedir:
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. Paketler Temelinde Projeler Arası Kaynak Erişimi.
UDF Örnekleri
Ek: UDF Kod Yapısı
Bir Java UDF'i aşağıdaki bileşenlerden oluşur:
-
Java paketi: İsteğe bağlı.
Java sınıflarınızı daha kolay yeniden kullanım ve organizasyon için bir pakette gruplandırabilirsiniz.
-
UDF sınıfını genişletme: Zorunlu.
Gerekli temel sınıf
com.aliyun.odps.udf.UDFsınıfıdır. Diğer UDF sınıflarına veya karmaşık veri türlerine ihtiyacınız varsa MaxCompute SDK üzerinden gerekli sınıfları ekleyin. Örneğin, STRUCT veri türü için sınıfcom.aliyun.odps.data.Structşeklindedir. -
@Resolveaçıklaması: İsteğe bağlı.Biçim
@Resolve(<signature>)şeklindedir; buradasignaturegiriş parametrelerinin ve dönüş değerinin veri türlerini tanımlar. Bir UDF'te STRUCT veri türünü kullandığınızda yansıma, alan adlarını ve alan türlerinicom.aliyun.odps.data.Structüzerinden alamaz. Bu durumda bunları almak için@Resolveaçıklamasını kullanmanız gerekir. Bir UDF'te STRUCT kullanıyorsanız UDF sınıfına@Resolveaçıklamasını ekleyin. Açıklama yalnızca parametreleri veya dönüş değerleri com.aliyun.odps.data.Struct içeren aşırı yüklemeleri etkiler. Örnek:@Resolve("struct<a:string>,string->string"). Ayrıntılı bir örnek için bkz. UDF Örneği: Karmaşık Veri Türleri. -
Özel Java sınıfı: Zorunlu.
Bu, UDF kodunuzu organize eden ve iş mantığınızı uygulayan değişkenleri ve yöntemleri tanımlayan birimdir.
-
evaluateyöntemi: Zorunlu.Özel Java sınıfınız statik olmayan genel bir
evaluateyöntemi içermelidir. Giriş parametrelerinin ve dönüş değerinin veri türleri UDF'in SQL imzasını tanımlar.Birden çok
evaluateyöntemi uygulayabilirsiniz. UDF'i çağırdığınızda MaxCompute, bağımsız değişken türlerine göre eşleşenevaluateyöntemini seçer.Bir Java UDF'i yazarken Java türlerini veya Java Writable türlerini kullanabilirsiniz. MaxCompute veri türleri ile Java veri türleri arasındaki ayrıntılı eşlemeler için bkz. Ek: Veri Türleri.
UDF başlatma ve temizleme: İsteğe bağlı.
void setup(ExecutionContext ctx)vevoid close()kullanarak başlatma ve temizleme işlemlerini uygulayabilirsiniz.void setup(ExecutionContext ctx)yöntemi,evaluateyönteminden önce bir kez çağrılır ve hesaplama için gereken kaynakları veya üye nesnelerini başlatmak amacıyla kullanılabilir.void close()yöntemi, tümevaluateçağrıları tamamlandıktan sonra bir kez çağrılır ve dosyaları kapatma gibi temizleme görevleri için kullanılır.
Aşağıdaki örneklerde iki tür UDF gösterilmektedir.
-
Java türlerini kullanma
// Organize the Java class in the org.alidata.odps.udf.examples package. package org.alidata.odps.udf.examples; // Inherit the UDF class. import com.aliyun.odps.udf.UDF; // Define a custom Java class. public final class Lower extends UDF { // The evaluate method defines the UDF's logic. It takes a String and returns a String. public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Java Writable türlerini kullanma
// Organize the Java class in the com.aliyun.odps.udf.example package. package com.aliyun.odps.udf.example; // Add the required classes for the Java Writable type. import com.aliyun.odps.io.Text; // Inherit the UDF class. import com.aliyun.odps.udf.UDF; // Define a custom Java class. public class MyConcat extends UDF { private Text ret = new Text(); // Define the evaluate method. `Text` specifies the data type of the input parameters, and the `return` value is also a Text object. public Text evaluate(Text a, Text b) { if (a == null || b == null) { return null; } ret.clear(); ret.append(a.getBytes(), 0, a.getLength()); ret.append(b.getBytes(), 0, b.getLength()); return ret; } }
MaxCompute ayrıca uyumlu Hive sürümü için geliştirilen UDF'leri de destekler. Daha fazla bilgi için bkz. Hive UDF Uyumluluğu.
Ek: Veri Türleri
Veri Türü Eşlemeleri
Bir Java UDF'inde kullanılan veri türlerinin MaxCompute veri türleriyle tutarlı olmasını sağlamak için aşağıdaki eşlemeleri kullanın.
MaxCompute tarafından desteklenen veri türleri veri türü sürümüne göre değişir. MaxCompute 2,0 sürümünden başlayarak ARRAY, MAP ve STRUCT gibi karmaşık türler dahil olmak üzere ek veri türleri kullanılabilir. Daha fazla bilgi için bkz. Veri Türü Sürümleri.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Java byte[] türü desteklenen Java türleri listesinde yer almaz. Bir evaluate yönteminin giriş parametresi veya dönüş değeri için byte[] kullanırsanız ODPS-0130071 hatası bildirilir. Bir UDF'te ikili verileri işlemek için MaxCompute BINARY türüne karşılık gelen Java türlerini kullanın: Standart Java türü için com.aliyun.odps.data.Binary veya Writable türü için com.aliyun.odps.io.BytesWritable. Alternatif olarak ikili verileri Base64 kodlamalı bir dizeye dönüştürüp dönüş değeri için String türünü kullanabilirsiniz.
Hive UDF Uyumluluğu
MaxCompute projeniz 2,0 veri türü sürümünü kullanıyorsa MaxCompute Hive tarzı UDF'leri destekler. Uyumlu bir Hive sürümü için geliştirilen Hive UDF'lerini doğrudan kullanabilirsiniz.
Uyumlu Hive sürümü 2,1,0'dır ve bu sürüm Hadoop 2,7,2'ye karşılık gelir. UDF'iniz farklı bir Hive veya Hadoop sürümüne göre derlendiyse UDF JAR dosyasını Hive 2,1,0 veya Hadoop 2,7,2 ile yeniden derleyin.
MaxCompute'te Hive UDF kullanımıyla ilgili ayrıntılı bir örnek için bkz. UDF Örneği: Hive Uyumluluğu.