2016-12-30 3 views
0

У меня есть работа, которую нужно сделать многократно. Например, скажем, я хочу бросить 2000 кубиков и собрать результат. Оговорка - бросок кубика зависит от PCollection Как это можно сделать с помощью Dataflow?Как сделать одну и ту же работу несколько раз с использованием Dataflow?

Я попытался использовать PCollectionList, но в результате мой поток данных слишком велик, чтобы начать (> 10 МБ). Вот пример того, что я хотел бы сделать (с помощью PCollectionList):

// I'd like to operate on things 2000 times. 
PCollection<Thing> things = ...; 
List<PCollection<ModifiedThing>> modifiedThingsList = new ArrayList<>(); 
for (int i = 0; i < 2000; ++i) { 
    modifiedThingsList.add(things.apply(ParDo.of(thing -> modify(thing))); 
} 
PCollection<ModifiedThing> modifiedThings = PCollectionList.of(modifiedThingsList).apply(Flatten.pCollections()); 

Поскольку представление JSON из приведенного графика слишком велика для DataFlow, мне нужен другой способ представления этой логики. Есть идеи?

+0

Можете ли вы уточнить, «бросок кубика зависит от PCollection»? Это не очевидно из вашего фрагмента кода. – jkff

+0

Например, «вещи» действительно были «PCollection ». Примером «бросания кубиков» было бы добавить случайное число к каждому элементу в PCollection, повторяя процесс 2000 раз. Я попытался проиллюстрировать это с помощью вызова метода «модификация (вещь)». – Max

+1

Я все еще смущен: ParDo может возвращать произвольно большое количество выходов на вход. Можете ли вы просто вещи.apply (ParDo.of (c -> for (i = 0..2000) c.output (изменить (c.element())))) или я не понимаю, что вы пытаетесь сделать? – jkff

ответ

2

ParDo или FlatMapElements может возвращать произвольно большое количество выходов на вход. Например:

PCollection<ModifiedThing> modifiedThings = things.apply(
    ParDo.of(new DoFn<Thing, ModifiedThing>() { 
    public void processElement(ProcessContext c) { 
    for (int i = 0; i < 2000; ++i) { 
     c.output(modify(c.element())); 
    } 
    } 
})); 

Оговорка: Если вы собираетесь немедленно применить другие ParDo с до modifiedThings, be careful with fusion, с 2000 года является довольно высоким веерным из фактора. Хорошим примером фрагмента кода для предотвращения слияния является here.

Смежные вопросы