2017-05-17 6 views
1

Flink(バッチ/ストリーミング)でフィールドの平均と合計を同時に計算する方法はありますか?集計メソッドを使用すると、groupBy結果のフィールドの合計を計算できますが、同時に平均を計算するにはどうすればよいですか?以下のコード例。シンプルなCSVの解析などのタスク、グループ化、および私はFLINKのTable APIを使用することをお勧めします集約するためのFlink - 合計と平均を同時に計算する方法は?

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); 
DataSet<Tuple3<String,Integer,Double>> source = 
     env.readCsvFile(PathConfig.LINEITEM_1) 
     .fieldDelimiter("|") 
     types(String.class, Integer.class, Double.class); 

source.groupBy(0,1).aggregate(Aggregations.SUM, 2); 
//average of field 2??? 
+0

集計の代わりにmap/reduceを使用できますか? – ImbaBalboa

+0

reduceGroupを使用して合計と平均を手動で計算することはできましたが、既にすばらしい集計関数があるので、平均を自動的に計算する方法もあると思います。 – Eli

答えて

1

より低レベルのAPIを使用したい場合は、(反復子が要素を持たない限り)合計/カウントする最後の平均を生成するGroupReduce関数を実装できます。

+0

テーブルAPIを使用するのはどういうわけか、ストリーミングテーブルの結合がないなど多くの制限があるようです。私は単純な集計関数でなければならないので、平均を計算する簡単な方法があるかどうか疑問に思っています。以前のソースコードでは、実際には平均集計関数があることがわかりましたが、新しいバージョンではコメントアウトされていましたが、なぜですか... – Eli

+0

はい、制限がありますが、DataStreamテーブル、それは非常に便利なツールです。以下も参照してください:http://flink.apache.org/news/2017/03/29/table-sql-api-update.html 平均化は簡単ですが、2つの操作が必要です(分割の集計ステップと最終的なマップ)戻り値の型は入力に依存します。ユーザーに必要なものを実装させる方がよいでしょう。 – twalthr

関連する問題