Indexing Flink中元素索引的自然方式

Indexing Flink中元素索引的自然方式,indexing,apache-flink,flink-streaming,Indexing,Apache Flink,Flink Streaming,是否有一种内置的方法来索引和访问数据流/数据集集合的各个元素的索引 像在典型的Java集合中一样,您知道,例如,ArrayList的第三个元素可以通过ArrayList.get(2)获得,反之亦然ArrayList.indexOf(elem)为我们提供指定元素(首次出现)的索引。(我不是要从流中提取元素。) 更具体地说,当joining数据流/数据集时,是否有一种“自然的”/简单的方法来连接第一个、第二个等元素 我知道有一种转换,它将顺序索引分配给元素。我怀疑索引总是以0开头?但我也怀疑它们不一

是否有一种内置的方法来索引和访问数据流/数据集集合的各个元素的索引

像在典型的Java集合中一样,您知道,例如,ArrayList的第三个元素可以通过
ArrayList.get(2)
获得,反之亦然
ArrayList.indexOf(elem)
为我们提供指定元素(首次出现)的索引。(我不是要从流中提取元素。)

更具体地说,当
join
ing数据流/数据集时,是否有一种“自然的”/简单的方法来连接第一个、第二个等元素

我知道有一种转换,它将顺序索引分配给元素。我怀疑索引总是以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)...
DataSet tempsJoIndexed=DataSetUtils.zipWithIndex(tempsJo);
数据集predsLinJoIndexed=DataSetUtils.zipWithIndex(predsLinJo);
数据集joinedTempsJo=临时索引
.join(predslinjoined).where(0).equalTo(0)。。。
而且它似乎产生了错误的配对

我看到了一些可能的方法,但它们要么不灵活,要么不是很好:

  • 当然,我可以为流上的每个元素分配一个索引 创建并具有例如
    元组流
    s

  • 使用事件时间戳。(我怀疑没有一种按时间戳进行键控的方法,即使有,也不会有什么用处 像这样连接多个流,除非时间戳是 实际指定为索引。)

  • 我们可以先尝试“收集”ing“流,但这样我们就不再使用Flink了


  • 1。这种方法似乎是最可行的,但它也似乎是多余的,因为根据定义,流应该是一个连续的集合,因此,元素应该有一种有序感(例如,“我是第36个元素,因为我前面已经有35个元素了。”。

    我认为您必须为元素分配索引值,这样,您就可以按此索引对数据集进行分区,从而确保需要连接的两个记录由同一个子任务处理。完成后,一个简单的
    groupBy(index)
    reduce()

    但是,如果您希望以并行度>1的方式读取源数据,那么分配不带间隙的递增ID并不是一件小事。在这种情况下,我将创建一个
    RichMapFunction
    ,它使用runtimeContext子任务id和子任务数来计算非重叠和单调索引