java—如何在ApacheFlink中定义数据集的起始位置?

5us2dqdw  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(444)

我尝试在ApacheFlink中实现一种窗口函数。例如,我想取元素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);

我在ApacheFlinkJavaAPI中没有找到任何东西。最好的存档方式是什么?

u2nhd7ah

u2nhd7ah1#

matthiassax为流式api提供了很好的窗口指示。如果应用程序遵循流式分析的模型,那么流式api绝对是正确的选择。
以下是有关流窗口的更多资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-操作员

批处理api中的窗口

也可以在批处理api中手动应用某种形式的窗口。应用windows时,应考虑以下因素:
大多数操作是并行的。当将n个元素一起开窗时,这通常是每个并行分区独立进行的。
元素没有隐含的顺序。即使在并行读取文件时,也可能是文件的后面部分被更快的并行读取器线程读取,并且这些后面部分的记录到达得更早。因此,按到达顺序对n个元素进行窗口处理只会得到一些n个元素。
按文件顺序显示窗口(非并行)
要在文件中按顺序打开窗口,可以将输入设置为非并行(使用 setParallelism(1) 然后使用 mapPartition() 将Windows滑动到构件上。
按某个值排序的窗口(例如,时间戳)
可以通过对分区进行排序来取消窗口分组(无键)( sortPartition().mapPartition() )或使用 groupBy(...).sortGroup(...).reduceGroup(...) . 这些函数根据要打开窗口的值将元素按顺序排列,并将数据滑动到窗口上。
一些并行窗口(没有好的语义)
您始终可以使用并行读取并在数据流上滑动窗口 mapPartition() . 但是,如上所述,元素的并行执行和未定义的顺序将给您一些窗口化结果,而不是可预测的窗口化结果。

相关问题