我如何使用HyperLogLogMonoid从代数鸟进行任意交点和联合



我想将一堆属于特定类别的值聚合到一个HLL数据结构中,这样我就可以在以后执行交集和并集,并计算这些计算的结果基数。

我可以使用com.twitter.algebird.HyperLogLogAggregator来估计每个组的基数

我需要帮助使用com.twitter.algebird.HyperLogLogMonoid存储为HLL,然后再利用计算交集/联合。

<>之前参数lines_parsed = lines。map {line => parseBlueKaiLogEntry(line)}# (uuid,[类别id数组])参数lines_parsed_flat = lines_parsed。flatMap {case(uuid, category_list) => category_list. tolist。{地图类别_id =>(类别_id, uuid)}}# (category_id, uuid)#按类别分组参数lines_parsed_grped = lines_parsed_flat。groupBy {Case (cat_id, uuid) => cat_id}#定义HLL聚合器val hll_uniq = HyperLogLogAggregator.sizeAggregator(bits=12).composePrepare[(String, String)]{case(cat_id, uuid) => uuid. tostring . getbytes ("UTF-8")}#聚合使用hll计数lines_parsed_grped.aggregate .dump (hll_uniq)# (category_id, count) -期望的输出之前

现在,我尝试使用HLL Monoid

<>之前#我现在想存储为HLL,这是我不确定该怎么做的地方创建HLL Monoidval hll = new HyperLogLogMonoid(bits = 12)参数lines_grped_hl = lines_parsed_grped。mapValues {case(cat_id:String, uuid:String) => uuid}.values。map {v:String => hll.create(v. getbytes ("UTF-8"))}#调用dump会导致比我期望看到的更多的行lines_grped_hll.dump之前

我在这里写什么

使用说明:

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

最新更新