2017-04-20 5 views
1

Ich möchte wissen, ob es möglich ist, Aggregationsoperationen für Werte durchzuführen, die in mehreren Zeilen gespeichert sind. Zum Beispiel habe ich die folgende TabelleVerwenden von Accumulos Iteratoren und Combinern zum Zusammenfassen von Werten aus mehreren Zeilen

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 

Was ich versuche, den Durchschnitt aller Werte mit columnQualifier A gespeichert zu tun ist, zu finden, ist es möglich, Accumulo die Iteratoren, Filter oder Combiner mit?

Ich sah die StatsCombiner, aber dieser Combiner führt Aggregation auf verschiedenen Versionen (rowID, colFam und colQual ist identisch, aber Timestamp ist anders) des gleichen Schlüssels statt Aggregation auf unterschiedliche Schlüssel selbst durchzuführen.

Antwort

1

Combiner (und ihre Vorgänger, Aggregatoren) tun Aggregation für den gleichen Schlüssel. Sie können einen Iterator erstellen, der mehrere Schlüssel in einen einzigen Schlüssel umwandelt, aber Sie müssen immer noch im Client aggregieren, da Sie für jedes Tablett eine Reihe von Teilberechnungen erstellen müssen.

Sie können die "Beobachter" Apache Fluo verwenden, um Ihre Statistiken zu speichern, während Sie in Ihre Tabelle aufnehmen.

Es gibt wahrscheinlich mehrere Lösungen. Ich würde vorschlagen, einen Blick auf Apache Fluo zu werfen, und wenn Sie das wirklich nicht verwenden möchten, dann ziehen Sie in Erwägung, Partialsummen/-zählungen als Iterator in jedem Tablett zu aggregieren und die abschließende Aggregation auf der Client-Seite durchzuführen.

0

Lassen Sie mich dies mit der Tatsache vortragen, dass ich Accumulo seit Jahren nicht mehr verwendet habe, aber ich bin mir nicht sicher, dass Sie das auf der Server-Seite komplett tun können. Der Grund dafür ist, dass Sie nach Werten im CQ suchen, die auf alle Knoten des Accumulo-Clusters verteilt werden. I.e. Der Tablet-Server, der über 00000: 0000 informiert ist, weiß (garantiert) nichts über Werte für 00002: 0000 usw. Sie müssen wahrscheinlich eine zweite Indizierung Ihrer Daten durchführen, um diese Funktionalität bereitzustellen (z. B. Making die CQ die RowID), oder Sie müssen die Aggression auf der Client-Seite tun. Möglicherweise können Sie einen hybriden Ansatz machen, indem Sie einige agg pro Tablet durchführen und die restlichen agg auf der Client-Seite ausführen.

Verwandte Themen