如何在 Apache Flink 中定义数据集的起始位置?

How to define the start position of a dataset in Apache Flink?

我尝试在 Apache Flink 中实现一种 window 功能。例如,我想对元素 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。存档的最佳方式是什么?

Matthias Sax 为 windowing 提供了很好的流媒体 API 指导。如果应用程序遵循流式分析模型,流式 API 绝对是正确的方法。

这里有更多关于流 windowing 的资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators

Windows 批次 API

也可以在批处理 API 中手动应用某种形式的 windowing。应用 windows 时,应考虑以下因素:

  • 大多数操作是并行的。当 windowing n 个元素在一起时,这通常发生在每个并行分区上。

  • 没有隐含的元素顺序。即使在并行读取文件时,也可能是文件的后面部分由更快的并行 reader 线程读取,并且来自这些后面部分的记录更早到达。 Windowing n 元素的到达顺序因此只给你一些 n 元素。

Window 按文件中的顺序(非并行)

To window by order in a file,可以设置输入为非平行(源上使用setParallelism(1))然后使用mapPartition()滑动window 在元素上。

按某个值(例如时间戳)Window排序

您可以通过使用 groupBy(...).sortGroup(...).reduceGroup(...) 对分区 (sortPartition().mapPartition()) 或 window 对组进行排序来 window 取消分组(无键)。这些函数根据您想要 window 的值对元素进行排序,然后将数据滑到 window.

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

您始终可以并行读取并使用 mapPartition() 在数据流上滑动 window。但是,如上所述,元素的并行执行和未定义顺序会给您 一些 windowed 结果,而不是可预测的 windowed 结果。