Простой способ анализа данных на основе общего ключа

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

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

Результатом будут исходные температуры с их новой классификацией.

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

Спасибо


person G B    schedule 28.12.2014    source источник


Ответы (2)


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

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

person Frances    schedule 29.12.2014
comment
Спасибо, это то, что я в конечном итоге сделал, так как я также хотел иметь статистику в виде отдельного вывода. - person G B; 29.12.2014

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

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

person Jeremy Lewi    schedule 29.12.2014