我尝试在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时,应考虑以下几点:

  • 大多数操作是并行的。当将n个元素一起窗口化时,这通常在每个并行分区中独立发生。
  • 没有元素的隐式顺序。即使从文件并行读取,也可能是文件的较后部分被较快的并行读取器线程读取,而这些较晚部分中的记录则更早到达。因此,按到达顺序对n个元素进行窗口化处理,只会给您一些n个元素。

  • 文件中的按顺序排列的窗口(非并行)

    要按顺序在文件中窗口化,可以将输入设置为非平行(在源上使用setParallelism(1)),然后使用mapPartition()在元素上滑动窗口。

    某个值(例如时间戳)的有序窗口

    您可以通过对分区(sortPartition().mapPartition())进行排序来对未分组的窗口(无键)进行窗口化,也可以使用groupBy(...).sortGroup(...).reduceGroup(...)对窗口进行分组化。这些函数将元素与要在其上进行窗口显示的值相对应,并在数据上滑动至窗口。

    一些并行窗口(语义不好)

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

    关于java - 如何在Apache Flink中定义数据集的开始位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31772225/

    10-12 14:00
    查看更多