4

我尝试在 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 中没有找到任何东西。存档此文件的最佳方法是什么?

4

1 回答 1

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)在源上使用),然后使用 amapPartition()将窗口滑过元素。

按某个值排序的窗口(例如,时间戳)

您可以通过对分区 ( sortPartition().mapPartition()) 排序或使用groupBy(...).sortGroup(...).reduceGroup(...). 这些函数根据您要窗口化的值将元素按顺序排列,然后将数据滑过窗口。

一些并行窗口(没有好的语义)

您始终可以并行阅读并使用mapPartition(). 但是,如上所述,元素的并行执行和未定义的顺序会给您一些窗口化结果,而不是可预测的窗口化结果。

于 2015-08-10T14:30:50.393 回答