我尝试在Apache Flink中实现一种窗口函数。例如,我想采用元素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);
我在Apache Flink Java API中找不到任何东西。存档的最佳方式是什么?
答案 0 :(得分:3)
Matthias Sax已经为流窗口API提供了很好的指导。如果应用程序遵循流分析模型,则流API绝对是正确的方法。
以下是有关流窗口化的更多资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators
批处理API中的也可以在Batch API中手动应用某种形式的窗口。应用窗口时,应考虑以下因素:
大多数操作都是并行的。将 n 元素一起窗口化时,这通常会独立于每个并行分区。
没有隐含的元素顺序。即使从并行读取文件,也可能是文件的后续部分由更快的并行读取器线程读取,并且来自这些后续段的记录更早到达。在到达顺序中窗口 n 元素因此只为您提供了一些 n 元素。
文件中的顺序窗口(非并行)
要按文件中的顺序窗口,您可以将输入设置为非平行(在源上使用setParallelism(1)
),然后使用mapPartition()
将窗口滑过元素。< / p>
按某个值排序的窗口(例如,时间戳)
您可以通过使用sortPartition().mapPartition()
对分区(groupBy(...).sortGroup(...).reduceGroup(...)
)或窗口进行排序来对窗口进行未分组(无密钥)窗口。这些函数根据您想要窗口的值按顺序显示元素,并将数据滑动到窗口。
一些并行窗口(没有好的语义)
您始终可以使用mapPartition()
并行读取并在数据流上滑动窗口。但是,如上所述,元素的并行执行和未定义顺序将为您提供一些窗口结果,而不是可预测的窗口结果。