[英]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
也可以在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.