2016-11-07 10 views
1

Я хотел бы объединить кучу значений, относящихся к определенной категории, в структуру данных HLL, чтобы впоследствии можно было выполнить пересечения и объединения, мощность таких вычислений.Как использовать HyperLogLogMonoid из Algebird для выполнения произвольных пересечений и объединений

я был в состоянии добраться до точки, где я могу оценить мощность для каждой группы с помощью com.twitter.algebird.HyperLogLogAggregator

мне нужна помощь по использованию com.twitter.algebird.HyperLogLogMonoid для хранения в ЯВУ, а затем позже использовать для вычисления пересечений/союзов.

 
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 

Теперь я пытаюсь использовать HLL моноидными

 
# 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 

Что я делаю скрутить здесь?

+0

Какого результата вы ожидали? Общая сумма кошек, сгруппированных по идентификаторам? – FaigB

ответ

0

Использование:

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

result.dump