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

时间:2015-08-02 13:11:34

标签: java apache-flink

我尝试在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中找不到任何东西。存档的最佳方式是什么?

1 个答案:

答案 0 :(得分:3)

Matthias Sax已经为流窗口API提供了很好的指导。如果应用程序遵循流分析模型,则流API绝对是正确的方法。

以下是有关流窗口化的更多资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators

批处理API中的

Windows

也可以在Batch API中手动应用某种形式的窗口。应用窗口时,应考虑以下因素:

  • 大多数操作都是并行的。将 n 元素一起窗口化时,这通常会独立于每个并行分区。

  • 没有隐含的元素顺序。即使从并行读取文件,也可能是文件的后续部分由更快的并行读取器线程读取,并且来自这些后续段的记录更早到达。在到达顺序中窗口 n 元素因此只为您提供了一些 n 元素。

文件中的顺序窗口(非并行)

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

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

您可以通过使用sortPartition().mapPartition()对分区(groupBy(...).sortGroup(...).reduceGroup(...))或窗口进行排序来对窗口进行未分组(无密钥)窗口。这些函数根据您想要窗口的值按顺序显示元素,并将数据滑动到窗口。

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

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