Realtime Compute for Apache Flink, Flink SQL işlerinde Java kullanıcı tanımlı işlevleri (UDF) destekler. UDF türleri, parametre aktarımı ve önemli kullanım notları hakkında bilgi edinin.
Önemli notlar
-
UDF geliştirirken JAR paketi bağımlılık çakışmalarını önlemek için aşağıdaki hususları göz önünde bulundurun:
SQL geliştirme sayfasında seçilen Flink sürümünün Pom bağımlılığındaki Flink sürümüyle eşleştiğinden emin olun.
Flink ile ilgili bağımlılıklar için,
<scope>provided</scope>ekleyerek kapsamıprovidedolarak ayarlayın.Diğer üçüncü taraf bağımlılıklarını Shade yöntemiyle paketleyin. Daha fazla bilgi için bkz. Apache Maven Shade Plugin.
Flink bağımlılık çakışmaları hakkında daha fazla bilgi için bkz. Flink bağımlılık çakışmalarını nasıl çözerim?.
Bir SQL işinde UDF'ye sık yapılan çağrılardan kaynaklanan zaman aşımlarını önlemek için UDF JAR paketini bir bağımlılık dosyası olarak yükleyebilirsiniz. Ardından, işlevi
CREATE TEMPORARY FUNCTIONsöz dizimini kullanarak işte bildirin. Örnek:CREATE TEMPORARY FUNCTION 'GetJson' AS 'com.soybean.function.udf.MyGetJsonObjectFunction';
UDF sınıflandırmaları
Flink aşağıdaki üç UDF türünü destekler.
|
|
|
|
|
|
|
|
|
|
|
|
UDF kaydı
Genel bir UDF'nin nasıl kaydedileceği hakkında bilgi için bkz. Genel UDF'ler.
İş düzeyinde bir UDF'nin nasıl kaydedileceği hakkında bilgi için bkz. İş düzeyi UDF'ler.
Bir UDF'ye parametre aktarma
Flink geliştirme konsolunda bir UDF için parametreleri yapılandırabilir ve bunları UDF kodunda referans alabilirsiniz. Bu sayede parametre değerlerini doğrudan konsolda hızla değiştirebilirsiniz.
UDF'ler isteğe bağlı bir open(FunctionContext context) yöntemi sağlar. FunctionContext, özel yapılandırma öğelerini parametre olarak aktarır. Süreç şu şekildedir:
-
Flink geliştirme konsolundaki sayfasının Configuration sekmesinde, Parameters bölümünün Other Configuration kısmına pipeline.global-job-parameters yapılandırma öğesini ekleyin.
pipeline.global-job-parameters: | 'k1:{hi,hello}', 'k2:"str:ing,str:ing"', 'k3:"str""ing,str:ing"'FunctionContext#getJobParameteryalnızcapipeline.global-job-parametersiçinde tanımlanan değerleri alabilir. UDF'nin kullandığı tüm yapılandırma öğelerini bu parametreye dahil etmelisiniz. Aşağıdaki adımlarda bu öğenin nasıl yapılandırılacağı açıklanmaktadır.Adım
Eylem
Yordam
Örnek
1. Adım
Anahtar-değer çiftlerini tanımlayın.
Anahtarı ve değeri iki nokta üst üste (:) ile ayırın ve her anahtar-değer çiftini tek tırnak içine (') alın.
Not-
Bir anahtar veya değer iki nokta üst üste (:) içeriyorsa anahtarı veya değeri çift tırnak içine (") alın.
-
Bir anahtar veya değer iki nokta üst üste (:) veya çift tırnak (") içeriyorsa bunu ardışık iki çift tırnak ("") ile kaçış karakteri olarak belirtmeniz gerekir.
-
Anahtar = k1 ve
değer = {hi,hello}ise çifti'k1:{hi,hello}'olarak tanımlayın. -
Anahtar = k2 ve
değer = str:ing,str:ingise çifti'k2:"str:ing,str:ing"'olarak tanımlayın. -
Anahtar = k3 ve
değer = str"ing,str:ingise çifti'k3:"str""ing,str:ing"'olarak tanımlayın.
2. Adım
Nihai pipeline.global-job-parameters değerini bir YAML dosyası olarak biçimlendirin.
Her anahtar-değer çiftini yeni bir satıra yerleştirin ve virgül (,) ile ayırın.
Not-
YAML dosyasındaki çok satırlı bir dize dikey çubuk (|) ile başlar.
-
YAML dosyasındaki çok satırlı bir dizenin her satırı aynı girintiye sahip olmalıdır.
pipeline.global-job-parameters: | 'k1:{hi,hello}', 'k2:"str:ing,str:ing"', 'k3:"str""ing,str:ing"' -
-
UDF kodunda, her öğenin değerini almak için
FunctionContext#getJobParameterkullanın. Aşağıdaki kod bir örnektir.Örnek:
context.getJobParameter("k1", null); // Returns the string {hi,hello}. context.getJobParameter("k2", null); // Returns the string str:ing,str:ing. context.getJobParameter("k3", null); // Returns the string str"ing,str:ing. context.getJobParameter("pipeline.global-job-parameters", null); // Returns null. You can only get the content defined in pipeline.global-job-parameters, not any other job configuration item.
Adlandırılmış parametreler
UDF'leri uygulamak için adlandırılmış parametreler kullanımı yalnızca Ververica Runtime (VVR) 8.0.7 ve sonraki sürümlerde desteklenir.
Standart işlev çağrıları tüm parametrelerin doğru sırada belirtilmesini gerektirir. Bu durum, çok sayıda parametresi olan işlevler için hata yapmaya açıktır ve isteğe bağlı parametrelerin atlanmasına izin vermez. Adlandırılmış parametreler yalnızca ihtiyacınız olan parametreleri belirtmenize olanak tanır. Aşağıdaki ScalarFunction örneği adlandırılmış parametrelerin nasıl kullanılacağını gösterir.
// Implement a user-defined scalar function. The last two input parameters are optional (isOptional = true).
public class MyFuncWithNamedArgs extends ScalarFunction {
private static final long serialVersionUID = 1L;
public String eval(@ArgumentHint(name = "f1", isOptional = false, type = @DataTypeHint("STRING")) String f1,
@ArgumentHint(name = "f2", isOptional = true, type = @DataTypeHint("INT")) Integer i2,
@ArgumentHint(name = "f3", isOptional = true, type = @DataTypeHint("LONG")) Long l3) {
if (i2 != null) {
return "i2#" + i2;
}
if (l3 != null) {
return "l3#" + l3;
}
return "default#" + f1;
}
}
Bu UDF'yi SQL'de kullanırken yalnızca gerekli parametreyi belirtebilir veya isteğe bağlı parametreleri seçici olarak dahil edebilirsiniz.
CREATE TEMPORARY FUNCTION MyNamedUdf AS 'com.aliyun.example.MyFuncWithNamedArgs';
CREATE temporary TABLE s1 (
a INT,
b BIGINT,
c VARCHAR,
d VARCHAR,
PRIMARY KEY(a) NOT ENFORCED
) WITH (
'connector' = 'datagen',
'rows-per-second'='1'
);
CREATE temporary TABLE sink (
a INT,
b VARCHAR,
c VARCHAR,
d VARCHAR
) WITH (
'connector' = 'print'
);
INSERT INTO sink
SELECT a,
-- Specify only the first required parameter
MyNamedUdf(f1 => c) arg1_res,
-- Specify the first required parameter and the second optional parameter
MyNamedUdf(f1 => c, f2 => a) arg2_res,
-- Specify the first required parameter and the third optional parameter
MyNamedUdf(f1 => c, f3 => d) arg3_res
FROM s1;
Referanslar
Java UDF'lerinin geliştirilmesine ve kullanılmasına ilişkin örnekler için bkz. Kullanıcı tanımlı toplam işlevleri (UDAF), Kullanıcı tanımlı skaler işlevler (UDSF) ve Kullanıcı tanımlı tablo değerli işlevler (UDTF).
Python UDF'lerinin hata ayıklama ve performans iyileştirme hakkında bilgi için bkz. Genel bakış.
Python UDF'lerinin geliştirilmesine ve kullanılmasına ilişkin örnekler için bkz. Kullanıcı tanımlı toplam işlevleri (UDAF), Kullanıcı tanımlı skaler işlevler (UDSF) ve Kullanıcı tanımlı tablo değerli işlevler (UDTF).