我尝试在Apache Flink中实现一种窗口功能。例如,我要采用元素1-5并对其进行处理,然后再想采用元素6-10,依此类推。
目前,我有一个数据集,其数据由CSV文件导出:
DataSet<Tuple2<Double, Double>> csvInput = env
.readCsvFile(csvpath)
.includeFields(usedFields)
.types(Double.class, Double.class);
现在,我想拥有该数据集的前5个元素的子集。我可以使用
first
-function来做到这一点:DataSet<Tuple2<Double, Double>> subset1 = csvInput.first(5);
但是如何获得下5个元素?是否可以使用类似
startAt
函数的函数?例如这样的事情:DataSet<Tuple2<Double, Double>> subset2 = csvInput.first(5).startAt(6);
我没有在Apache Flink Java API中找到任何东西。存档的最佳方法是什么?
最佳答案
Matthias Sax很好地指出了用于窗口化的流API。如果应用程序遵循流分析的模型,那么流API绝对是正确的选择。
以下是有关流窗口的更多资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators
Windows在批处理API中
也可以在Batch API中手动应用某种形式的窗口。应用Windows时,应考虑以下几点:
文件中的按顺序排列的窗口(非并行)
要按顺序在文件中窗口化,可以将输入设置为非平行(在源上使用
setParallelism(1)
),然后使用mapPartition()
在元素上滑动窗口。某个值(例如时间戳)的有序窗口
您可以通过对分区(
sortPartition().mapPartition()
)进行排序来对未分组的窗口(无键)进行窗口化,也可以使用groupBy(...).sortGroup(...).reduceGroup(...)
对窗口进行分组化。这些函数将元素与要在其上进行窗口显示的值相对应,并在数据上滑动至窗口。一些并行窗口(语义不好)
您始终可以使用
mapPartition()
并行读取并在数据流上滑动窗口。但是,如上所述,元素的并行执行和未定义的顺序将为您提供一些窗口化结果,而不是可预测的窗口化结果。关于java - 如何在Apache Flink中定义数据集的开始位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31772225/