繁体   English   中英

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

[英]How to define the start position of a dataset in 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中找不到任何东西。 存档这个的最佳方法是什么?

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()在元素上滑动窗口。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM