Apache flink 在不同的集合中多次使用数据集,而无需多次填充数据集

Apache flink 在不同的集合中多次使用数据集,而无需多次填充数据集,apache-flink,Apache Flink,是否有任何方法可以在同一数据集上执行不同的收集,而无需在Apache Flink中多次填充该数据集? 我只想填充一次数据集,并在其上应用几个不同的集合 下面的代码似乎读取了数据文件两次,这是我想要避免的 myDataset=env.readCsvFile(…); DataSet>test1=myDataset.map(新的map1()).filter(新的filter1()); DataSet>test2=myDataset.map(新的map2()).filter(新的filter2());

是否有任何方法可以在同一数据集上执行不同的收集,而无需在Apache Flink中多次填充该数据集? 我只想填充一次数据集,并在其上应用几个不同的集合

下面的代码似乎读取了数据文件两次,这是我想要避免的

myDataset=env.readCsvFile(…);
DataSet>test1=myDataset.map(新的map1()).filter(新的filter1());
DataSet>test2=myDataset.map(新的map2()).filter(新的filter2());
ListList1=test1.collect();
ListList2=test2.collect();
// ...

使用
collect()
无法实现这一点。您需要添加不会触发作业执行的接收器,并显式启动程序。例如,您可以将结果写入文件:

myDataset=env.readCsvFile(…);
DataSet>test1=myDataset.map(新的map1()).filter(新的filter1());
DataSet>test2=myDataset.map(新的map2()).filter(新的filter2());
test1.writeAsCsv();
test2.writeAsCsv();
env.execute();//触发执行
有关可用的接收器,请参阅文档:


之后,您需要将
中的结果集手动读取到客户端应用程序中。

这是不可能的。每次调用
collect()
都会从头开始触发集群中的执行。但是你说的“不同的收集”是什么意思?简单地说,我指的是不同的收集执行。确切地说,我有一个数据集,我对它应用了不同的转换。然后,我在上一步中生成的不同数据集上运行了collect命令。如果我理解正确,您想收集中间结果吗?当
collect()
将数据从集群复制到客户端时,我假设数据集很小。因此,您可以一次将作业拆分为多个作业,并通过
fromElements()
将第一次收集的结果馈送到下一个作业中。数据集不小我从文件中读取它,并进行一些不同的转换和筛选,从而生成不同的结果数据集。在这之后,我对每个结果应用collect来生成后续步骤的中间结果。如果结果数据集很大(听起来效率很低),为什么要将数据拉到客户端?您能否共享数据流程序的结构(包括所有收集)?请编辑您的问题。我的所有目标是避免现在多次读取输入文件,使用此方法我必须再次执行冗余工作。另一个问题是强制转换异常org.apache.flink.api.java.operators.DataSink无法强制转换为java.util.list这将只读取一次输入文件!我刚刚更新了代码。列表中的赋值错误。。。(是代码示例中的c&p错误)。您需要在
env.execute()
之后添加其他代码以访问结果文件。