在我发现的示例中,仅对一维数据阵列执行分箱。我想bin二维数据,以模拟SQL的groupby /聚合。这可能是使用histogrammar吗?
(问题转自Michel Page。)
答案 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直方图,但它具有相同的信息。