2016-01-26 14 views
5

Google Cloud Dataflowの使い方は非常に新しいです。私は2つのPCコレクションのデカルト積を得たいと思います。たとえば、2つのPCコレクションが(1, 2)("hello", "world")の場合、デカルト積は((1, "hello"), (1, "world"), (2, "hello"), (2, "world"))です。2つのPCコレクションのデカルト積を取得するには

どのようにすればよいのでしょうか?また、デカルト積が大きくなる可能性があるので、私はこのソリューションが遅れて製品を作成し、メモリの消費を避けることを望んでいます。

ありがとうございます!

+0

あなたは何をしようとしているかについて詳しくはありますか?それぞれのPCコレクションの大きさはどれくらいですか?これを達成するにはいくつかの方法がありますが、デカルト積と実際のPCollectionを必要とする理由によって、どちらが良いかが決まります。 –

+0

2つのPCollectionは同じです。それらはどちらも '(String、String)'型の約10万のタプルを含んでいます。私は英語の単語の辞書を使用しており、「fantasti-CAL-ifornia」のように2単語の言葉遣いを生成するために表音文字列を得ています。 –

+0

直接的なデカルト解については、[this](http://stackoverflow.com/a/41051283/377366)が現在利用可能な最良の答えのようです。 – KobeJohn

答えて

3

一般に、デカルト積の計算は高価になります。コレクションのいずれか(または両方)がメモリに収まる場合は、side-inputsを使用して、すべてのワーカーにデータをブロードキャストできます。したがって、あなたの例では、PCollection<String>をサイド入力に変換してから、ParDoをメイン入力として使用します。メイン入力の各文字列については、すべての値のIterable<String>を持つサイド入力にアクセスできます。ペアを出力することもできます(または、DoFnは、ペアの出力のみを選択できます)。

これは、毎回単語のセット全体を繰り返します。メモリに収まる場合は、これはうまくいくはずです。問題が発生するたびにサイド入力データを再フェッチする必要がある場合。

もう1つのアプローチは、シャッフルとキーに依存することです。 3文字の重なりがある単語を探したかったとします。辞書を処理して、PCollectionの値を3文字の接頭辞で入力することができます。また、同様のPCollectionを3文字のサフィックスで作成することもできます。次に、GroupByKey(またはCoGroupByKey)とすることができます。その後、3文字のキーごとに、その文字を接頭辞として、それを接尾辞として持つすべての単語があります。

+0

入力いただきありがとうございます!私はおそらく 'GroupByKey'メソッドを使うでしょう! –

+3

これは実際にデカルト積を行う方法の問題に答えるものではありません。 – Max

関連する問題