私が見出した例では、ビニングは1Dのデータ配列に対してのみ実行されます。私はSQLのgroupby/aggregationをシミュレートするために2Dのデータをbinしたいと思います。ヒストグラムママを使って可能ですか?ヒストグラムの二次元集約
(ミシェル・ページから転載質問。)
私が見出した例では、ビニングは1Dのデータ配列に対してのみ実行されます。私はSQLのgroupby/aggregationをシミュレートするために2Dのデータをbinしたいと思います。ヒストグラムママを使って可能ですか?ヒストグラムの二次元集約
(ミシェル・ページから転載質問。)
はい、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
これは、上記のように、あなたにペアではなく、組み合わせカテゴリ-ビニングヒストグラムを与えるだろうが、それは同じ情報です。