Algorithm 应用商店如何计算每个应用的唯一下载计数?
唯一性意味着,如果一个应用程序被用户下载超过1次,其下载计数将永远保持为1,直到另一个用户再次下载该应用程序。例如,我们跟踪用户下载的行为如下:Algorithm 应用商店如何计算每个应用的唯一下载计数?,algorithm,performance,hadoop,data-structures,analytics,Algorithm,Performance,Hadoop,Data Structures,Analytics,唯一性意味着,如果一个应用程序被用户下载超过1次,其下载计数将永远保持为1,直到另一个用户再次下载该应用程序。例如,我们跟踪用户下载的行为如下: Date User App name 2012-01-01 jack Angry Birds 2012-01-01 jack Angry Birds 2012-01-02 jack Angry Birds 2012-01-02 paul Angry Birds
Date User App name
2012-01-01 jack Angry Birds
2012-01-01 jack Angry Birds
2012-01-02 jack Angry Birds
2012-01-02 paul Angry Birds
2012-01-02 jack Snappea
这将产生以下结果:
Angry Birds 2
Snappea 1
实现它的一个简单方法是,我们使用数据结构,例如HashSet来存储User+App name作为它的键。但事实上,AppStore拥有大量用户和应用程序。假设用户编号为400M,并且有650K个应用程序,在最坏的情况下,哈希集的大小将达到400M*650K=260T。我们还假设每天需要计算下载数量
据统计,截至2012年6月,App Store的总下载量为300亿。这仍然是一个很大的数字
那么,我们如何以更少的空间和更快的速度实现呢?如果使用hadoop/hbase?使用数据库:拥有一个用户表。每个用户都应该有下载历史记录。当用户下载应用程序时,它将被添加到下载历史记录中。如果这是一个新的应用程序,它还将使用触发器更新应用程序表以增加计数。听起来不错?SQL具有独特的统计功能。类似这样的东西:为生锈的SQL感到抱歉,可能无法工作,但想法类似:SELECT app、COUNTSELECT DISTINCT app、来自myTable t2的用户和来自myTable t1的用户;这意味着数据库需要存储300亿行?我想添加新记录时会影响性能。您要求每天计算。只需每天更新计数创建的表。另一种方法是在地图中维护数据,并通过简单的Map.getapp.size.Looks good获得唯一用户的数量。谢谢你的回答。但是你会如何处理用户重新下载的应用程序呢@zenpoyYou仅当应用程序在用户应用程序历史记录中是新应用程序时才增加应用程序的计数。