如何在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-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中找到任何东西。归档此内容的最佳方法是什么?

斯蒂芬·埃文(Stephan Ewen)

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

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

您可以使用来对分区(sortPartition().mapPartition())或组进行窗口排序,从而对未分组的窗口(无键)进行显示groupBy(...).sortGroup(...).reduceGroup(...)这些函数使元素相对于要在其上进行窗口显示的值顺序排列,并在数据上滑动至窗口。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章