[英]Flink Scala - Extending WindowFunction
我試圖弄清楚如何編寫我自己的WindowFunction
但有問題,我無法弄清楚為什么。 我遇到的問題是apply函數,因為它不能將MyWindowFunction
識別為有效輸入,所以我無法編譯。 我正在流式傳輸的數據包含(timestamp,x,y)
,其中x和y為0和1用於測試。 extractTupleWithoutTs
只返回一個元組(x,y)
。 我一直在使用簡單的sum和reduce函數運行代碼並且成功。 感謝任何幫助:)使用Flink 1.3
進口:
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks
import org.apache.flink.streaming.api.scala.function.WindowFunction
import org.apache.flink.streaming.api.watermark.Watermark
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector
其余代碼:
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val text = env.socketTextStream("localhost", 9999).assignTimestampsAndWatermarks(new TsExtractor)
val tuple = text.map( str => extractTupleWithoutTs(str))
val counts = tuple.keyBy(0).timeWindow(Time.seconds(5)).apply(new MyWindowFunction())
counts.print()
env.execute("Window Stream")
MyWindow函數基本上是從示例中復制粘貼的類型更改。
class MyWindowFunction extends WindowFunction[(Int, Int), Int, Int, TimeWindow] {
def apply(key: Int, window: TimeWindow, input: Iterable[(Int, Int)], out: Collector[Int]): () = {
var count = 0
for (in <- input) {
count = count + 1
}
out.collect(count)
}
}
問題是WindowFunction
的第三個類型參數,即鍵的類型。 密鑰在keyBy
方法( keyBy(0)
)中使用索引聲明。 因此,在編譯時無法確定密鑰的類型。 如果將鍵聲明為字符串,即keyBy("f0")
, keyBy("f0")
出現同樣的問題。
有兩種方法可以解決這個問題:
keyBy
使用KeySelector
函數來提取密鑰(類似於keyBy(_._1)
)。 KeySelector
函數的返回類型在編譯時是已知的,這樣您就可以使用帶有Int
鍵的正確類型的WindowFunction
。 WindowFunction
的第三個類型參數的類型更改為org.apache.flink.api.java.tuple.Tuple
,即WindowFunction[(Int, Int), Int, org.apache.flink.api.java.tuple.Tuple, TimeWindow]
。 Tuple
是keyBy
提取的密鑰的通用持有者。 在你的情況下,它將是一個org.apache.flink.api.java.tuple.Tuple1
。 在WindowFunction.apply()
您可以將Tuple
為Tuple1
並通過Tuple1.f0
訪問關鍵字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.