我想用以下访问模式实现一种算法(类似于有限差分算法):
在此示例中,dataset_1的第一个值用于计算dataset_2的第一个和第二个值。所以,我应该为这个值设置2个不同的键。 因此,dataset_1 的某些值必须多次读取(2或3次)。
我想我必须使用groupBy(key).reduce(Algorithm)
转换,但我不知道如何定义键。
答案 0 :(得分:4)
除非您在单个线程中处理Flink DataSet,否则不会对其进行排序。例如,并行1.您可以如何为数据添加顺序索引并将该索引用作键。
从您的示例中,我假设dataset_2的索引4的值是根据dataset_1的值3,4和5计算的,即dataset_2的每个值都是从dataset_1的三个(或两个)值派生的。
有多种方法可以做你想要的,有些方法易于实施,有些方法更有效。
执行所需操作的简便方法是在dataset_1上应用FlatMapFunction
,使用三个键i
,i-1
三次,使用索引i
发出每个值,和i+1
。之后,将结果数据集分组到新键上,并使用GroupReduce函数计算新值。这种方法使dataset_1的数据量增加了三倍,但可以很容易地并行化。
另一种选择是进行手动范围分区,这与第一种方法类似,但更通用。我再次假设dataset_1的值具有顺序idx
属性。使用FlatMapFunction将partitionIds
分配给值,即,对于100个元素的分区大小,执行partitionId = idx / 100
之类的操作。分区的第一个和最后一个元素需要发出两次。例如,对于partitionId 1(值100到199)具有idx
100和199的元素需要分别通过发送这些值两次来复制到分区0和2。分配partitionIds
后,您可以groupBy(partitionId)
,sortGroup(idx)
和groupReduce
覆盖分区的所有元素。分区的大小是可配置的。