Histogrammar中的二维聚合

时间:2016-11-29 14:15:21

标签: histogrammar

在我发现的示例中,仅对一维数据阵列执行分箱。我想bin二维数据,以模拟SQL的groupby /聚合。这可能是使用histogrammar吗?

(问题转自Michel Page。)

1 个答案:

答案 0 :(得分:1)

是的,可以通过嵌套1D聚合器来聚合2D数据。一个简单的例子是2D直方图:

hist2d = Bin(numX, lowX, highX, lambda event: event.x,
           Bin(numY, lowY, highY, lambda event: event.y))

(Python语法;替换Scala的lambda函数等)。第一个Bin聚合器按event.x分区数据并将其传递给第二个,恰好是另一个Bin而非默认Count

但你说"模拟groupBy / SQL聚合。" GROUP BY整数bin编号可以将SQL查询用作直方图,在这种情况下,Histogrammar示例只是一种更简单的方法。但是,当人们在SQL中使用GROUP BY时,它们通常按一些分类数据进行分组,例如字符串。

在Histogrammar中,那将是

groupedHists = Categorize(lambda event: event.category,
                 Bin(num, low, high, lambda event: event.numerical))

此处,Categorize取代Bin为每个唯一字符串创建一个新的子聚合器。

最后,如果您正在处理大量类别,您可能希望使用底层系统(例如Spark的)map-reduce功能来进行聚合 - -键。如果Histogrammar这样做,Spark会随机向N个工人发送数据,每个工人收集所有类别的数据,然后费力地合并。如果Spark这样做,Spark会将给定类别的所有数据发送给同一个worker,使用更少的内存并使合并更容易。

这是Spark(Scala)中groupedHists的高效版本:

val groupedHists =
    rdd.map(event => (event.category, event))
       .aggregateByKey(Bin(num, low, high, {event: Event => event.numerical}))
         (new Increment, new Combine)
       .collect

这将为您提供(String, Histogram)对,而不是如上所述的组合分类 - Binned直方图,但它具有相同的信息。