2017-05-17 5 views
1

Gibt es einen Weg in Flink (Batch/Streaming), um den Durchschnitt und die Summe eines Feldes gleichzeitig zu berechnen? Mit der aggregierten Methode kann ich die Summe eines Feldes auf einem groupBy-Ergebnis berechnen, aber wie berechne ich den Durchschnitt auch gleichzeitig? Beispielcode unten.Flink - wie berechnet man Summe und Durchschnitt zur gleichen Zeit?

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

Könnten Sie map/reduce anstelle von aggregate verwenden? – ImbaBalboa

+0

Ich könnte reduceGroup verwenden, um sowohl die Summe als auch den Durchschnitt manuell zu berechnen, aber da es bereits eine nette Summensummenfunktion gibt, dachte ich, dass es vielleicht auch eine Möglichkeit gibt, den Durchschnitt automatisch zu berechnen. – Eli

Antwort

1

Für einfache Aufgaben wie das CSV-Analyse, Gruppierung und Aggregation Ich würde Flink die Table API zu verwenden empfehlen.

Wenn Sie lieber mehr Low-Level-APIs verwenden möchten, können Sie eine GroupReduce-Funktion implementieren, die summiert/zählt (bis der Iterator keine Elemente mehr enthält) und am Ende einen endgültigen Durchschnittswert erstellt.

+0

Ich bin irgendwie unsicher, die Tabellen-API zu verwenden, weil sie anscheinend viele Einschränkungen hat (wie keine Joins für Streaming-Tabellen). Ich frage mich nur, ob es eine einfache Methode gibt, den Durchschnitt zu berechnen, weil es nur eine einfache Aggregatfunktion sein sollte, oder? Ich sah im älteren Quellcode, dass es tatsächlich eine durchschnittliche Aggregatfunktion gab, aber es wurde in der neuen Version auskommentiert, ich frage mich, warum das so ist ... – Eli

+0

Ja, es hat Einschränkungen, aber da kann man zwischen DataStream hin und her gehen und Tabelle, es ist ein ziemlich nützliches Werkzeug. Siehe auch: http://flink.apache.org/news/2017/03/29/table-sql-api-update.html Mittelung scheint einfach, aber es erfordert zwei Operationen (ein Aggregationsschritt und eine endgültige Karte für die Division) und der Rückgabetyp hängt von der Eingabe ab. Es ist besser, den Benutzer das umsetzen zu lassen, was er benötigt. – twalthr

Verwandte Themen