可以用map-reduce方式计算一组数据的百分位数吗?

时间:2012-09-16 02:53:05

标签: java statistics mapreduce percentile

我的理解是计算百分位数,需要对数据进行排序。这可以通过分布在多个服务器上的大量数据来实现,而无需移动它吗?

3 个答案:

答案 0 :(得分:2)

虽然MapReduce作为范例看起来并不适合这个问题,但hadoop的MR实现却是。
Hadoop的map reduce实现基于分布式排序 - 这正是您所需要的。 Hadoop只是通过在服务器之间移动数据进行排序 - 不是那么糟糕。
我建议看一下hadoop terasort的实现,它说明了用hadoop对大量数据进行排序的好方法(也可能是最好的方法)。 http://hadoop.apache.org/docs/current/api/org/apache/hadoop/examples/terasort/package-summary.html

答案 1 :(得分:2)

我首先要在一台机器或多台机器上创建一个直方图。一旦计算了可能值的桶的每个可能值,您可以根据需要组合这些值。使用直方图的好处是它具有O(1)插入/排序时间而不是O(log n)并使用O(M)空间,其中M是可能值或桶的数量而不是O(N)其中N是样本的数量。

直方图是自然排序的,因此您可以通过从任一端计数来获得总计数并找到百分位数。

答案 2 :(得分:0)

您的问题的答案是可能。但是Map-Reduce并不是真的适合这种任务。 Map-Reduce(例如,在Hadoop集群中使用)可以照亮非结构化或半结构化数据。虽然它具有能力来处理其他类型,但它并不是最适合它的。 (我在一家公司有一个项目,他们想在Hadoop集群中分析XML ......这不是最有趣的事情。)

This scholarly article描述了Map-Reduce对结构化数据的一些问题,并为“Clydesdale”提供了另一种方法。 (我从来没有听说过或使用过这个,所以我既不认可也不说它的优点/缺点。)

我正在寻找提供解释和替代方案的更多链接。