Google cloud dataflow 如何在数据流中创建序列生成器?

Google cloud dataflow 如何在数据流中创建序列生成器?,google-cloud-dataflow,Google Cloud Dataflow,使用PTransforms,我生成了100万个对象。但是,我需要使用从1到100万的单个唯一数字来标记这些对象。没有指定生成这些对象的顺序,但序列号应连续在100万到100万之间 所以,我需要一个db世界中的“autonum”函数,或者也称为“序列生成器”。有没有办法在谷歌云数据流中实现精简 我唯一想到的是: a) 将所有对象存储为Single PCollectionView对象,然后按顺序遍历此列表,并分配一个新的hashmap,其中包含sequenceKey和对象值。这不是超高效的,并且在尝

使用PTransforms,我生成了100万个对象。但是,我需要使用从1到100万的单个唯一数字来标记这些对象。没有指定生成这些对象的顺序,但序列号应连续在100万到100万之间

所以,我需要一个db世界中的“autonum”函数,或者也称为“序列生成器”。有没有办法在谷歌云数据流中实现精简

我唯一想到的是:

a) 将所有对象存储为Single PCollectionView对象,然后按顺序遍历此列表,并分配一个新的hashmap,其中包含sequenceKey和对象值。这不是超高效的,并且在尝试将所有一百万个对象存储在内存中时会出现问题,但这是一个应该可以工作的解决方法

b) 也许使用某种可以从所有笔记中访问的memcache服务,并从中执行原子读取增量?(不知道如何做到这一点,但这可能是可能的。)但是,这感觉像是为一个简单的序列生成器编写了很多代码(而且,我也不确定性能是否会很差,因为seq生成器调用可能会导致所有内容都出现瓶颈)


c) 删除序列号是连续的要求,然后执行类似于上面“b”的操作。

Beam的Java SDK中的有状态处理可以简单地支持这种行为。这是因为状态信息可以跨包保存,因此可以对整个PCollection的元素进行编号

你可以阅读更多关于它的内容

可以执行此操作的DoFn如下所示:

new DoFn<KV<MyKey, MyValue>, KV<Integer, KV<MyKey, MyValue>>>() {

  // A state cell holding a single Integer per key+window
  @StateId("index")
  private final StateSpec<Object, ValueState<Integer>> indexSpec = 
      StateSpecs.value(VarIntCoder.of());

  @ProcessElement
  public void processElement(
      ProcessContext context,
      @StateId("index") ValueState<Integer> index) {
    int current = firstNonNull(index.read(), 0);
    context.output(KV.of(current, context.element()));
    index.write(current+1);
  }
}
newdofn(){
//每个键+窗口包含一个整数的状态单元格
@StateId(“索引”)
private final StateSpec indexSpec=
StateSpecs.value(VarIntCoder.of());
@过程元素
公共无效处理元素(
ProcessContext上下文,
@StateId(“索引”)ValueState索引){
int current=firstNonNull(index.read(),0);
输出(千伏(当前,context.element());
索引写入(当前+1);
}
}

这将仅对每个键中的值进行编号,但如果需要对集合中的所有值进行编号,则与PCollectionView解决方案相比,它不会有所改进。您可以组成一个键,并在
PCollection的所有值上使用它。是,但是在这种情况下,您不需要stateAPI——您只需迭代以KV为单位的Iterable并为每个值编号即可。但是,对于多个触发器触发,您确实需要状态API来保持连续编号。如果我们希望序列生成器遵循顺序,例如context.element()值的排序顺序,该怎么办?即使在光束中也有可能吗?考虑到现有的Beam sdk,我无法找到一种方法。