2017-01-03 7 views
0

Мне нужно сбросить неограниченный PCollection элементов значения ключа в агрегаты каждой клавиши (вывод агрегата после каждого ввода был применен). Важно, чтобы значения складывались в правильном порядке, и похоже, что это не поддерживается пользовательскими комбинаторами. Пропускная способность для каждой клавиши будет довольно низкой, но общая пропускная способность будет очень высокой. Есть ли способ сделать это в Dataflow?Складывающиеся элементы в значения

ответ

2

Правильно, комбинаторы неупорядочены. Это связано с тем, что неупорядоченное объединение имеет большой смысл в модели Beam, которая позволяет использовать поздние данные (что бы вы хотели, чтобы поведение было в вашем случае, в случае получения поздних данных?), А также потому, что оно допускает очень эффективную реализацию и в в большинстве случаев это все, что нужно.

Один из способов решить эту проблему для вашего случая, пожертвовав некоторой эффективностью, является реализация пользовательских CombineFn, где:

  • аккумулятора, а также тип вывода, является «список входных элементов, отсортированных по отметка времени».
  • Вставка элемента в аккумулятор вставляет его в отсортированный список
  • Слияние двух аккумуляторов объединяет отсортированные списки.
  • Извлечение выходного сигнала из аккумулятора является функцией идентификации.

В основном вы будете использовать зерноуборочный поддерживать упорядоченный список значений для каждого ключа, и вы получите PCollection<KV<K, List<V>>>, к которому можно применить ParDo с складкой.

+0

Похоже, что это сработает, но со временем состояние со временем будет расти - я надеялся на решение, где мне нужно было только поддерживать агрегированное состояние. –

+0

Я думаю, что для моего случая использования нормально применять события в обработке временного порядка - так что мне не нужно было бы опоздать, так как поздние события просто заходили в открытое в то время окно, которое было получено, не так ли? –

+0

Итак: учитывая предстоящий API состояния (BTW это скоро?: -D) Я бы мог иметь ParDo, который сохраняет текущее состояние за ключ в глобальном окне и просто применяет события по мере их появления ... если там тоже не заказывается, и в этом случае мне придется (я думаю) 1) хранить фиксированные временные окна на основе времени обработки; 2) GroupByKey; 3) помещено в новое глобальное окно; и 4) имеют сортировку ParDo и применяют события. Я думаю. –

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