如何在 Apache Flink 中定义数据集的起始位置?
How to define the start position of a dataset in Apache Flink?
我尝试在 Apache Flink 中实现一种 window 功能。例如,我想对元素 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 为 windowing 提供了很好的流媒体 API 指导。如果应用程序遵循流式分析模型,流式 API 绝对是正确的方法。
这里有更多关于流 windowing 的资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators
Windows 批次 API
也可以在批处理 API 中手动应用某种形式的 windowing。应用 windows 时,应考虑以下因素:
大多数操作是并行的。当 windowing n 个元素在一起时,这通常发生在每个并行分区上。
没有隐含的元素顺序。即使在并行读取文件时,也可能是文件的后面部分由更快的并行 reader 线程读取,并且来自这些后面部分的记录更早到达。 Windowing n 元素的到达顺序因此只给你一些 n 元素。
Window 按文件中的顺序(非并行)
To window by order in a file,可以设置输入为非平行(源上使用setParallelism(1)
)然后使用mapPartition()
滑动window 在元素上。
按某个值(例如时间戳)Window排序
您可以通过使用 groupBy(...).sortGroup(...).reduceGroup(...)
对分区 (sortPartition().mapPartition()
) 或 window 对组进行排序来 window 取消分组(无键)。这些函数根据您想要 window 的值对元素进行排序,然后将数据滑到 window.
一些并行windows(没有好的语义)
您始终可以并行读取并使用 mapPartition()
在数据流上滑动 window。但是,如上所述,元素的并行执行和未定义顺序会给您 一些 windowed 结果,而不是可预测的 windowed 结果。
我尝试在 Apache Flink 中实现一种 window 功能。例如,我想对元素 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 为 windowing 提供了很好的流媒体 API 指导。如果应用程序遵循流式分析模型,流式 API 绝对是正确的方法。
这里有更多关于流 windowing 的资源:https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators
Windows 批次 API
也可以在批处理 API 中手动应用某种形式的 windowing。应用 windows 时,应考虑以下因素:
大多数操作是并行的。当 windowing n 个元素在一起时,这通常发生在每个并行分区上。
没有隐含的元素顺序。即使在并行读取文件时,也可能是文件的后面部分由更快的并行 reader 线程读取,并且来自这些后面部分的记录更早到达。 Windowing n 元素的到达顺序因此只给你一些 n 元素。
Window 按文件中的顺序(非并行)
To window by order in a file,可以设置输入为非平行(源上使用setParallelism(1)
)然后使用mapPartition()
滑动window 在元素上。
按某个值(例如时间戳)Window排序
您可以通过使用 groupBy(...).sortGroup(...).reduceGroup(...)
对分区 (sortPartition().mapPartition()
) 或 window 对组进行排序来 window 取消分组(无键)。这些函数根据您想要 window 的值对元素进行排序,然后将数据滑到 window.
一些并行windows(没有好的语义)
您始终可以并行读取并使用 mapPartition()
在数据流上滑动 window。但是,如上所述,元素的并行执行和未定义顺序会给您 一些 windowed 结果,而不是可预测的 windowed 结果。