2016-11-29 8 views
1

私が見出した例では、ビニングは1Dのデータ配列に対してのみ実行されます。私はSQLのgroupby/aggregationをシミュレートするために2Dのデータをbinしたいと思います。ヒストグラムママを使って可能ですか?ヒストグラムの二次元集約

(ミシェル・ページから転載質問。)

答えて

1

はい、1Dアグリゲータをネストすることによって2次元データを集約することが可能です。

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

(;等のScalaの代替ラムダ関数、Pythonの構文):単純な例は、2Dヒストグラムです。最初のBinアグリゲーターはデータをevent.xで区切り、それを2番目のフィールドに渡します。これはデフォルトのCountの代わりに別のBinになります。

しかし、あなたは "模倣するgroupBy/SQLの集計"と言います。 SQLクエリをヒストグラムとして使用するには、整数ビン番号をGROUP BYすることができます。この場合、Histogrammarの例は、これを行うほうがはるかに簡単です。しかし、人がSQLでGROUP BYを実行すると、通常は文字列などのカテゴリデータでグループ化されます。ここで

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

だろうHistogrammarで

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 

これは、上記のように、あなたに​​ペアではなく、組み合わせカテゴリ-ビニングヒストグラムを与えるだろうが、それは同じ情報です。