我在Streams领域还很陌生,在我的第一次尝试中遇到了一些问题。
更具体地说,我正在尝试使用Flink在滑动窗口中实现count和groupBy功能。
我已经在普通的DateStream
中完成了此操作,但是我无法使其在WindowedStream
中工作。
您对我该如何建议?
val parsedStream: DataStream[(String, Response)] = stream
.mapWith(_.decodeOption[Response])
.filter(_.isDefined)
.map { record =>
(
s"${record.get.group.group_country}, ${record.get.group.group_state}, ${record.get.group.group_city}",
record.get
)
}
val result: DataStream[((String, Response), Int)] = parsedStream
.map((_, 1))
.keyBy(_._1._1)
.sum(1)
// The output of result is
// ((us, GA, Atlanta,Response()), 14)
// ((us, SA, Atlanta,Response()), 4)
result
.keyBy(_._1._1)
.timeWindow(Time.seconds(5))
//the following part doesn't compile
.apply(
new WindowFunction[(String, Int), (String, Int), String, TimeWindow] {
def apply(
key: Tuple,
window: TimeWindow,
values: Iterable[(String, Response)],
out: Collector[(String, Int)]
) {}
}
)
编译错误:
overloaded method value apply with alternatives:
[R](function: (String, org.apache.flink.streaming.api.windowing.windows.TimeWindow, Iterable[((String, com.flink.Response), Int)], org.apache.flink.util.Collector[R]) => Unit)(implicit evidence$28: org.apache.flink.api.common.typeinfo.TypeInformation[R])org.apache.flink.streaming.api.scala.DataStream[R] <and>
[R](function: org.apache.flink.streaming.api.scala.function.WindowFunction[((String, com.flink.Response), Int),R,String,org.apache.flink.streaming.api.windowing.windows.TimeWindow])(implicit evidence$27: org.apache.flink.api.common.typeinfo.TypeInformation[R])org.apache.flink.streaming.api.scala.DataStream[R]
cannot be applied to (org.apache.flink.streaming.api.functions.windowing.WindowFunction[((String, com.flink.Response), Int),(String, com.flink.Response),String,org.apache.flink.streaming.api.windowing.windows.TimeWindow]{def apply(key: String,window: org.apache.flink.streaming.api.windowing.windows.TimeWindow,input: Iterable[((String, com.flink.Response), Int)],out: org.apache.flink.util.Collector[(String, com.flink.Response)]): Unit})
.apply(
答案 0 :(得分:0)
我已经尝试过您的代码并发现错误,似乎在声明SharePhotoViewController
的类型时出现错误。
文档说WindowFunction
的预期类型为WindowFunction
。现在,如果您看一下代码,您的WindowFunction[IN, OUT, KEY, W <: Window]
是您要在其上计算窗口的数据流的类型。流的类型为IN
,而不是代码((String, Response), Int)
中声明的类型。
如果您将未编译的部分更改为:
(String, Int)
编辑:对于第二个示例,通常由于相同的原因而发生错误。当您将.apply(new WindowFunction[((String, Response), Int), (String, Response), String, TimeWindow] {
override def apply(key: String, window: TimeWindow, input: Iterable[((String, Response), Int)], out: Collector[(String, Response)]): Unit = ???
})
与keyBy
一起使用时,您有两个可以使用Tuple
的函数,该函数使用提供的索引使用整数来访问元组的字段(这就是您所使用的)。还有keyBy(fields: Int*)
,其中您提供了提取将要使用的密钥的功能。
但是这些函数之间有一个重要的区别,其中一个函数返回键为keyBy(fun: T => K)
,而另一个函数返回其确切类型的键。
因此,基本上,如果您在简化示例中将JavaTuple
更改为String
,则应该清楚地进行编译。
答案 1 :(得分:0)
这是我们可以处理的更简单的示例
val source: DataStream[(JsonField, Int)] = env.fromElements(("hello", 1), ("hello", 2))
val window2 = source
.keyBy(0)
.timeWindow(Time.minutes(1))
.apply(new WindowFunction[(JsonField, Int), Int, String, TimeWindow] {})