使用PTransforms,我生成100万个对象。但是,我需要用1到1百万的单个唯一数字标记这些对象。没有指定的顺序需要生成这些对象,但序列号应该连续不断地从1到100万。
所以,我需要db世界中的一个" autonum"功能或称为"序列发生器"。有没有办法在Google云数据流中实现精简?
我想出的唯一想法是:
a)将所有对象存储为signle PCollectionView对象,然后按顺序遍历此列表并分配一个具有sequenceKey和对象值的新hashmap。这不是超级高效的,并且在尝试将所有百万个对象存储在内存中时会出现问题,但这是一种应该可行的解决方法。
或
b)可能使用某种可从所有笔记访问的memcache服务并从中进行原子读取增量? (不知道如何做到这一点,但它可能是可能的。)但是,对于一个简单的序列生成器来说,这感觉就好了很多(同样,我也不确定性能是否会因为一切都可能因此而陷入困境) seq生成器调用)
c)删除序列号是连续的要求,然后执行与" b"类似的操作。上方。
答案 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);
}
}