簡體   English   中英

Flink Scala - 擴展WindowFunction

[英]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")出現同樣的問題。

有兩種方法可以解決這個問題:

  1. keyBy使用KeySelector函數來提取密鑰(類似於keyBy(_._1) )。 KeySelector函數的返回類型在編譯時是已知的,這樣您就可以使用帶有Int鍵的正確類型的WindowFunction
  2. WindowFunction的第三個類型參數的類型更改為org.apache.flink.api.java.tuple.Tuple ,即WindowFunction[(Int, Int), Int, org.apache.flink.api.java.tuple.Tuple, TimeWindow] TuplekeyBy提取的密鑰的通用持有者。 在你的情況下,它將是一個org.apache.flink.api.java.tuple.Tuple1 WindowFunction.apply()您可以將TupleTuple1並通過Tuple1.f0訪問關鍵字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM