2016-06-01 4 views
0

私は効率的に一緒にApache FLINKを使用して、2つのデータストリームをビュンに興味がある(しかし、同じ問題は、データセットに適用される場合があります)。 (Scalaの表記法を使用して)一例として効率的なジップ(暗黙のキーとしての位置で結合)

Iは

names: DataStream[String] 
ages: DataStream[Int] 

を有し、私は暗黙非公式(ストリーム内のデータの位置を用いて行われる参加

combined: DataStream[(String, Int)] 

を取得します:combined(i) = (names(i), ages(i)))。私は、各ストリームに「位置」フィールドを追加し、キーとしての位置を使用してそれらを一緒に参加することによって、これを取得することができますが、これは非常に非効率的です。

は、これを行うのいずれかのより良い方法はありますか?ありがとう!

答えて

0

カスタムCoFlatMap機能を使用できます。これが機能するためには、両方のマップ方法は予測できないため(データは二つの入力のために利用可能なときに依存する)に呼び出されますので、あなたは、あまりにも、二つの内部FIFOバッファが必要になります。

したがって、もしアルゴリズムが(両方のマップ機能のために同じアルゴリズム)以下のように動作する:各コールに

  1. を、他のバッファー、自バッファが空でない間、バッファを
  2. を所有する入力タプルを追加し、各バッファからタプルを取り出して組み合わせタプルを出力する

もちろん、このアルゴリズムにはさらにいくつかの最適化を適用することができます。このバージョンでは主なアイデアのみを示しています。

+0

ストリームは(RAM内に嵌合しない)大きいと仮定すると、それらは予測不可能ロードされ(例えば、最初のストリーム1、次に2ストリーム)、FIFOのいずれかが原因オーバーフローこのリードは、結合していない成長しないであろう? – cesco

+0

はい。両方のストリームは(つまり、レコードをバッファリングするのに十分なメモリがあること)オフセット有界で配信されている場合は、このソリューションにのみ動作します。もちろん、メモリ内ではなくディスク上のバッファに、これを拡張することもできます。したがって、固定数のタプルを使用すると、インメモリをバッファし、しきい値を超えるとディスクにスピルします。 –

関連する問題