4

Apache Flink に一種のウィンドウ関数を実装しようとしています。たとえば、要素 1 ~ 5 を取得して何かを行いたいとします。その後、要素 6 ~ 10 を取得したいとします。

現在、データが CSV ファイルによって導出されるデータセットがあります。

DataSet<Tuple2<Double, Double>> csvInput = env
        .readCsvFile(csvpath)
        .includeFields(usedFields)
        .types(Double.class, Double.class);

ここで、このデータセットの最初の 5 つの要素を含むサブセットが必要です。-関数でこれを行うことができるかもしれませんfirst

DataSet<Tuple2<Double, Double>> subset1 = csvInput.first(5);

しかし、次の 5 つの要素を取得するにはどうすればよいでしょうか。私が使用できる関数のような関数はありstartAtますか?たとえば、次のようなものです。

DataSet<Tuple2<Double, Double>> subset2 = csvInput.first(5).startAt(6);

Apache Flink Java API には何も見つかりませんでした。これをアーカイブする最良の方法は何ですか?

4

1 に答える 1

3

Matthias Sax は、ウィンドウ処理用のストリーミング API への適切な指針を示しています。アプリケーションがストリーミング分析のモデルに従っている場合、ストリーミング API は間違いなく正しい方法です。

ストリーム ウィンドウに関するその他のリソースを次に示します: https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators

バッチ API のウィンドウ

バッチ API で何らかの形式のウィンドウ処理を手動で適用することもできます。ウィンドウを適用するときは、次の点を考慮する必要があります。

  • ほとんどの操作は並列です。n 個の要素を一緒にウィンドウ処理する場合、これは通常、並列パーティションごとに個別に発生します。

  • 要素の暗黙的な順序はありません。ファイルから並列で読み取る場合でも、ファイルの後のセクションがより高速な並列リーダー スレッドによって読み取られ、これらの後のセグメントからのレコードが先に到着する場合があります。したがって、 n 個の要素を到着順にウィンドウ処理すると、いくつかのn 個の要素が得られます。

ファイル内の順序でウィンドウ (非並列)

ファイル内で順番にウィンドウを作成するには、入力を非平行 (setParallelism(1)ソースで使用) に設定してから、 a を使用しmapPartition()てウィンドウを要素の上にスライドさせます。

何らかの値 (例: タイムスタンプ) で並べ替えられたウィンドウ

sortPartition().mapPartition()パーティション ( ) をソートするか、 を使用してグループをウィンドウ処理することにより、グループ化されていない (キーなし) ウィンドウを作成できますgroupBy(...).sortGroup(...).reduceGroup(...)。関数は、ウィンドウに表示する値に関して要素を並べ替え、データをウィンドウにスライドさせます。

いくつかの並列ウィンドウ (セマンティクスが良くない)

を使用して、常に並行して読み取り、データ ストリーム上でウィンドウをスライドさせることができますmapPartition()。ただし、前述のように、要素の並列実行と未定義の順序により、予測可能なウィンドウ化された結果ではなく、何らかのウィンドウ化された結果が得られます。

于 2015-08-10T14:30:50.393 に答える