Kullanıcı tanımlı bir toplama işlevi (UDAF), birden çok girdi değerini tek bir çıktı değerinde toplar ve her grup için birçok girdi satırını tek bir sonuca eşler.
Bu konuda, Realtime Compute for Apache Flink'te Python UDAF'in nasıl oluşturulacağı, kaydedileceği ve kullanılacağı açıklanmaktadır.
Sınırlamalar
Apache Flink 1.12 veya sonraki bir sürüm gerekir.
-
Python, Realtime Compute for Apache Flink çalışma alanında önceden yüklenmiştir. Kodunuzu önceden yüklenmiş Python sürümünde yazın.
Ververica Runtime (VVR) 8.0.11'den önceki sürümler için Python 3.7.9 önceden yüklenmiştir. VVR 8.0.11 veya sonraki sürümler için Python 3.9.21 önceden yüklenmiştir. VVR 8.0.11 veya sonraki bir sürüme yükselttikten sonra, daha önceki bir VVR sürümü üzerine oluşturulan PyFlink işlerini yeniden test edin, yeniden dağıtın ve yeniden çalıştırın.
Çalışma zamanı ortamında JDK 8 ve JDK 11 desteklenir. Python dağıtımınız üçüncü taraf bir JAR dosyasına bağımlıysa JAR dosyasının JDK 8 veya JDK 11 ile uyumlu olduğundan emin olun.
Yalnızca açık kaynak Scala 2.11 desteklenir. Python dağıtımınız üçüncü taraf bir JAR dosyasına bağımlıysa JAR dosyasının Scala 2.11 ile uyumlu olduğundan emin olun.
Çalışma mantığı
Bir UDAF, girdi satırları arasındaki ara toplama durumunu izlemek için bir akümülatör kullanır. Akümülatör, grup başına bir kez oluşturulur ve tüm girdiler işlenene kadar satır satır güncellenir.
Her grup için yürütme sırası şu şekildedir:
create_accumulator()— başlangıç durumunu tutmak için boş bir akümülatör oluşturur.accumulate(accumulator, ...)— akümülatörü güncellemek üzere her girdi satırı için bir kez çağrılır.get_value(accumulator)— gruptaki tüm satırlar işlendikten sonra nihai sonucu döndürmek üzere çağrılır.
Yöntem referansı
| Yöntem | Gerekli | Ne zaman uygulanmalı |
|---|---|---|
create_accumulator() |
Evet | Her zaman |
accumulate(...) |
Evet | Her zaman |
get_value(...) |
Evet | Her zaman |
retract(...) |
Koşullu | Toplama işlemi geri çekme mesajları alabiliyorsa. |
UDAF oluşturma
Flink, UDAF'ler, kullanıcı tanımlı işlevler (UDF'ler) ve kullanıcı tanımlı tablo işlevleri (UDTF'ler) dahil olmak üzere kullanıcı tanımlı uzantılar (UDX'ler) için örnek kod sağlar. Aşağıdaki adımlar Windows ortamını kullanır.
python_demo-master paketini makinenize indirin ve arşivden çıkarın.
PyCharm'da File > Open seçeneğini belirleyin ve arşivden çıkarılmış
python_demo-masterdizinini açın.-
\python_demo-master\udx\udfs.pydosyasını açın ve iş mantığınıza uyacak şekilde düzenleyin. Aşağıdaki örnekte, mevcut ve geçmiş veriler üzerinden ağırlıklı ortalamayı hesaplayanweighted_avgtanımlanmıştır.from pyflink.common import Row from pyflink.table import AggregateFunction, DataTypes from pyflink.table.udf import udaf class WeightedAvg(AggregateFunction): def create_accumulator(self): # Row(sum, count) return Row(0, 0) def get_value(self, accumulator: Row) -> float: if accumulator[1] == 0: return 0 else: return accumulator[0] / accumulator[1] def accumulate(self, accumulator: Row, value, weight): accumulator[0] += value * weight accumulator[1] += weight def retract(self, accumulator: Row, value, weight): accumulator[0] -= value * weight accumulator[1] -= weight weighted_avg = udaf(f=WeightedAvg(), result_type=DataTypes.DOUBLE(), accumulator_type=DataTypes.ROW([ DataTypes.FIELD("f0", DataTypes.BIGINT()), DataTypes.FIELD("f1", DataTypes.BIGINT())])) -
\python_demo-master\dizinindenudxklasörünü paketleyin:zip -r python_demo.zip udxpython_demo.zipdosyası\python_demo-master\dizininde göründüğünde UDAF oluşturulmuş olur.
UDAF kaydetme
Kayıt adımları için bkz. Kullanıcı tanımlı işlevleri (UDF'ler) yönetme.
UDAF kullanma
-
Bir Flink SQL taslağı oluşturun. Ayrıntılar için bkz. İş geliştirme genel bakışı. Aşağıdaki örnekte, ağırlık olarak
balanı kullanılarakASI_UDAF_Sourceiçindekiaalanının ağırlıklı ortalaması hesaplanır.CREATE TEMPORARY TABLE ASI_UDAF_Source ( a BIGINT, b BIGINT ) WITH ( 'connector' = 'datagen' ); CREATE TEMPORARY TABLE ASI_UDAF_Sink ( avg_value DOUBLE ) WITH ( 'connector' = 'blackhole' ); INSERT INTO ASI_UDAF_Sink SELECT weighted_avg(a, b) FROM ASI_UDAF_Source; Realtime Compute for Apache Flink geliştirme konsolunun sol gezinme bölmesinde O&M > Deployments seçeneğini belirleyin. Hedef dağıtımı bulun ve Actions sütunundaki Start seçeneğine tıklayın. Dağıtım başladıktan sonra, ağırlık olarak
balanı kullanılarakaalanının ağırlıklı ortalamasıASI_UDAF_Sinkiçindeki her satıra yazılır.