2016-11-29 105 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 

這會給你如上​​雙,而不是合併範疇分箱直方圖,但它是相同的信息。