2016-11-29 78 views
1

在我发现的例子中,只对一维数组数据执行分箱。为了模拟SQL的groupby/aggregation,我想将二维数据分类。这可能使用histogrammar?直方图中的二维聚合

(问米歇尔页转载。)

回答

1

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

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

(Python语法;替代λ-功能Scala中,等等)。第一个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会将给定类别的所有数据发送给同一个工作人员,整体使用较少的内存并使合并更容易。

这里是groupedHists在星火高效的版本(斯卡拉):

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

这会给你如上​​双,而不是合并范畴分箱直方图,但它是相同的信息。