Использование итераторов и объединителей Accumulo для агрегирования значений из нескольких строк

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

rowID   colFam   colQual   value
00000   0000     A         12
00000   0001     B         Test
00001   0000     A         35
00001   0001     B         Foo
00002   0000     A         7
00002   0001     B         Bar

Я пытаюсь найти среднее значение для всех значений, хранящихся в columnQualifier A. Возможно ли использовать итераторы, фильтры или объединители Accumulo?

Я видел StatsCombiner, но этот объединитель выполняет агрегацию в разных версиях (rowID, colFam и colQual - это одно и то же, но разная временная метка) одного и того же ключа вместо агрегирования для отдельных ключей.

2 ответа

Решение

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

Вы можете использовать "наблюдателей" Apache Fluo, чтобы собирать статистику, пока вы принимаете данные за столом.

Там, вероятно, несколько решений. Я бы посоветовал взглянуть на Apache Fluo, и если вы действительно не хотите его использовать, рассмотрите возможность агрегирования частичных сумм / подсчетов в качестве итератора в каждой таблетке и окончательного агрегирования на стороне клиента.

Позвольте мне предвосхитить это тем фактом, что я не использовал Accumulo годами, но я не уверен, что вы сможете сделать это полностью на стороне сервера. Причина в том, что вы ищете значения в CQ, которые будут распределены среди всех узлов кластера Accumulo. Т.е. планшетный сервер, который знает о 00000:0000, не (гарантированно) ничего не знает о значениях для 00002:0000 и т. Д. Вам, вероятно, придется выполнить вторую индексацию ваших данных, чтобы обеспечить эту функциональность (т.е. делая CQ RowID), или вам придется выполнять агрегацию на стороне клиента. Возможно, вам удастся использовать гибридный подход, заключающийся в том, чтобы использовать агг на планшет и оставшуюся агг на стороне клиента.

Другие вопросы по тегам