如何在DataFlow中创建序列生成器?

时间:2017-03-29 18:04:21

标签: google-cloud-dataflow

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

所以,我需要db世界中的一个" autonum"功能或称为"序列发生器"。有没有办法在Google云数据流中实现精简?

我想出的唯一想法是:

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

b)可能使用某种可从所有笔记访问的memcache服务并从中进行原子读取增量? (不知道如何做到这一点,但它可能是可能的。)但是,对于一个简单的序列生成器来说,这感觉就好了很多(同样,我也不确定性能是否会因为一切都可能因此而陷入困境) seq生成器调用)

c)删除序列号是连续的要求,然后执行与" b"类似的操作。上方。

1 个答案:

答案 0 :(得分:0)

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

您可以详细了解in this blog post

可以执行此操作的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);
  }
}