2016-11-07 3 views
1

Ich möchte eine Reihe von Werten, die zu einer bestimmten Kategorie gehören, zu einer HLL-Datenstruktur zusammenfassen, damit ich später Kreuzungen und Vereinigungen durchführen und zählen kann Kardinalität solcher Berechnungen.Wie verwende ich HyperLogLogMonoid von Algebird, um willkürliche Kreuzungen und Vereinigungen auszuführen

konnte ich den Punkt kommen, wo ich Kardinalität für jede Gruppe

die com.twitter.algebird.HyperLogLogAggregator mit schätzen

ich helfen com.twitter.algebird.HyperLogLogMonoid verwenden, müssen als HLL zu speichern und dann später verwenden, um Kreuzungen/Vereinigungen zu berechnen.

 
val lines_parsed = lines.map { line => parseBlueKaiLogEntry(line) } 
# (uuid, [category id array]) 

val lines_parsed_flat = lines_parsed.flatMap { 
    case(uuid, category_list) => category_list.toList.map { 
     category_id => (category_id, uuid) 
    } 
} 
# (category_id, uuid) 

# Group by category 
val lines_parsed_grped = lines_parsed_flat.groupBy { 
     case (cat_id, uuid) => cat_id 
     } 

# Define HLL aggregator 
val hll_uniq = HyperLogLogAggregator.sizeAggregator(bits=12).composePrepare[(String, String)]{case(cat_id, uuid) => uuid.toString.getBytes("UTF-8")} 

# Aggregate using hll count 
lines_parsed_grped.aggregate(hll_uniq).dump 
# (category_id, count) - expected output 

Jetzt versuche ich HLL Monoid

 
# I now want to store as HLL and this is where I'm not sure what to do 
# Create HLL Monoid 
val hll = new HyperLogLogMonoid(bits = 12) 

val lines_grped_hll = lines_parsed_grped.mapValues { case(cat_id:String, uuid:String) => uuid}.values.map {v:String => hll.create(v.getBytes("UTF-8"))} 

# Calling dump results in a lot more lines that I expect to see 
lines_grped_hll.dump 

Was mache ich hier wringen zu benutzen?

+0

Welche Art von Ergebnis Sie erwartet hatten? Gesamtsumme der Katzen nach Ids gruppiert? – FaigB

Antwort

0

Verwendung:

val result = hll.sum(lines_grped_hll) //or suitable method of hll for you 

result.dump 
Verwandte Themen