是否有内置方法来索引和访问DataStream/DataSet集合中各个元素的索引?
就像在典型的 Java 集合中一样,您知道例如 ArrayList 的第 3 个元素可以通过ArrayList.get(2)
获得,反之亦然,ArrayList.indexOf(elem)
为我们提供了指定元素的索引(第一次出现(。(我不是在问从流中提取元素。
更具体地说,在join
数据流/数据集时,是否有一种"自然"/简单的方法来连接首先、第二等出现的元素?
我知道有一个zipWithIndex
转换,它将顺序索引分配给元素。我怀疑索引总是以 0 开头?但我也怀疑它们不一定按照元素的创建顺序(即按其事件时间(分配。(它也仅适用于数据集。 这是我目前尝试的:
DataSet<Tuple2<Long, Double>> tempsJoIndexed = DataSetUtils.zipWithIndex(tempsJo);
DataSet<Tuple2<Long, Double>> predsLinJoIndexed = DataSetUtils.zipWithIndex(predsLinJo);
DataSet<Tuple3<Double, Double, Double>> joinedTempsJo = tempsJoIndexed
.join(predsLinJoIndexed).where(0).equalTo(0)...
它似乎创造了错误的对。
我看到了一些可能的方法,但它们要么不是 Flink,要么不是很好:
我当然可以为流上的每个元素分配一个索引 创造并具有例如
Tuple
流。使用事件时间时间戳。(我怀疑没有办法按时间戳键控,即使有,它也对 像这样加入多个流,除非时间戳是 实际分配为索引。
我们可以先尝试"
collect
"流,但随后我们将不再使用 Flink。
1. 方法似乎是最可行的方法,但它似乎也是多余的,因为根据定义,流应该是一个顺序集合,因此,元素应该具有有序感(例如,"我是第 36 个元素,因为 35 个元素已经在我之前了。
我认为您必须为元素分配索引值,以便您可以按此索引对数据集进行分区,从而确保需要连接的两条记录由同一子任务处理。完成此操作后,一个简单的groupBy(index)
和reduce()
就可以了。
但是,如果要在 1>并行读取源数据,则分配没有间隙的递增 ID 并非易事。在这种情况下,我将创建一个RichMapFunction
,该使用 runtimeContext 子任务 ID 和子任务数来计算非重叠和单调索引。