我尝试在ApacheFlink中实现一种窗口函数。例如,我想取元素1-5并对它们做些什么,然后我想取元素6-10,依此类推。
目前,我有一个数据集,其数据由csv文件派生:
DataSet<Tuple2<Double, Double>> csvInput = env
.readCsvFile(csvpath)
.includeFields(usedFields)
.types(Double.class, Double.class);
现在我想要一个包含这个数据集前5个元素的子集。我也许可以用 first
-功能:
DataSet<Tuple2<Double, Double>> subset1 = csvInput.first(5);
但是如何获得接下来的5个元素呢?有没有一个函数像 startAt
功能,我可以使用吗?例如:
DataSet<Tuple2<Double, Double>> subset2 = csvInput.first(5).startAt(6);
我在ApacheFlinkJavaAPI中没有找到任何东西。最好的存档方式是什么?
1条答案
按热度按时间u2nhd7ah1#
matthiassax为流式api提供了很好的窗口指示。如果应用程序遵循流式分析的模型,那么流式api绝对是正确的选择。
以下是有关流窗口的更多资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-操作员
批处理api中的窗口
也可以在批处理api中手动应用某种形式的窗口。应用windows时,应考虑以下因素:
大多数操作是并行的。当将n个元素一起开窗时,这通常是每个并行分区独立进行的。
元素没有隐含的顺序。即使在并行读取文件时,也可能是文件的后面部分被更快的并行读取器线程读取,并且这些后面部分的记录到达得更早。因此,按到达顺序对n个元素进行窗口处理只会得到一些n个元素。
按文件顺序显示窗口(非并行)
要在文件中按顺序打开窗口,可以将输入设置为非并行(使用
setParallelism(1)
然后使用mapPartition()
将Windows滑动到构件上。按某个值排序的窗口(例如,时间戳)
可以通过对分区进行排序来取消窗口分组(无键)(
sortPartition().mapPartition()
)或使用groupBy(...).sortGroup(...).reduceGroup(...)
. 这些函数根据要打开窗口的值将元素按顺序排列,并将数据滑动到窗口上。一些并行窗口(没有好的语义)
您始终可以使用并行读取并在数据流上滑动窗口
mapPartition()
. 但是,如上所述,元素的并行执行和未定义的顺序将给您一些窗口化结果,而不是可预测的窗口化结果。