2014-12-28 15 views
1

Каким будет самый простой способ обработки всех записей, которые были сопоставлены определенному ключу, и выводить несколько записей для этих данных.Простой способ анализа данных на основе общего ключа

Например (синтетический пример), предполагая, что мой ключ - это дата, а значения - это временные метки времени внутри с измеренными температурами. Я хотел бы классифицировать температуры в высокий/средний/низкий в течение дня (опять же, ниже/выше 1 stddev от среднего).

Выходные данные были бы исходными температурами с их новыми классификациями.

Использование Combine.PerKey (CombineFn) допускает только один вывод на ключ с использованием метода #extractOutput().

Благодаря

ответ

5

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

Если ваши значения на один ключ не подходят в памяти (поэтому вы не можете использовать шаблон GroupByKey-ParDo, который предлагает Джереми), но вычисленная статистика поместится в память, вы также можете сделать что-то вроде этого: (1) Используйте Combine.perKey() для вычисления статистики в день (2) Используйте View.asIterable(), чтобы преобразовать их в PCollectionViews. (3) Перепрограммируйте исходный вход с помощью ParDo, который принимает статистику как боковые входы. (4) В DoFn ParDo у них есть startBundle(), которые берут боковые входы и создают время отображения структуры данных в памяти в статистику, которая может использовать для поиска в processElement.

+0

Спасибо, это то, что я закончил, так как я также хотел, чтобы статистика была отдельным выходом. –

1

Почему бы не использовать операцию GroupByKey с последующим Pardo? GroupBy будет группировать все значения с заданным ключом. Применение ParDo позволяет обрабатывать все значения с помощью заданного ключа. Используя ParDo, вы можете вывести несколько значений для заданного ключа.

В вашем примере температуры, выход GroupByKey будет PCollection из KV < Integer, Iterable < Float >> (Я предполагаю, что вы используете Integer для представления День и Float для температуры). Затем вы можете применить ParDo для обработки каждого из этих KV. Для каждого КВ вы можете перебирать Float, представляя температуру, и вычислять hi/average/low temperature. Затем вы можете классифицировать каждое чтение температуры с использованием этих характеристик и выводить запись, представляющую классификацию. Это предполагает, что количество измерений для каждого дня достаточно мало, чтобы легко вписаться в память.