一个流中几个不同字段的平均值



我还没有选择流框架,但我现在正在搞乱 Flink。但是,我愿意使用Beam,Spark Streaming,任何我认为适合我的用例的东西。您将如何执行以下SQL的等效操作:

SELECT a,b,c, avg(d), avg(e), ..., avg(z)
FROM whatever
GROUP BY a,b,c,d,e, ..., z

对于 Flink 来说,做平均值似乎是通过聚合函数 https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/common/functions/AggregateFunction.java#L61

但我不明白你是如何做出这个"规模"的。这似乎是很多样板,只是为了一个领域的平均值。如果我有几个不同的流,需要平均各种字段,该怎么办?

Flink,Beam,结构化流等中的任何一个是否使这变得更容易?

作为旁注,有没有一种简单的方法来模拟 Postgres 的这个漂亮的小计数过滤器语法,

SELECT
  COUNT(*) AS unfiltered,
  COUNT(*) FILTER (WHERE some_condition) AS filtered
FROM whatever

通常在 flink 作业中,我会将定义的用户函数创建为单独的类,然后我可以将其应用于我喜欢的任何字段。Flink 还有一个 SQL API,我不太熟悉,但这里有一个基于我在这里找到的代码的示例(https://gist.github.com/mustafaakin/457859b8bf703c64029071c1139b593d(:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment table = TableEnvironment.getTableEnvironment(env);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
DataStream<String> text = env.socketTextStream("localhost", 9999, "n");
DataStream<Tuple3<String, Double, Time>> dataset = text.map(...);
table.registerDataStream("dataset", dataset, "p1, p2, p3");
String query = "SELECT p1, AVG(p2) AS avgp2 FROM dataset GROUP p1";
Table tableResult = table.sql(query);
// print to System.out
table.toAppendStream(tableResult, Row.class).print();
env.execute();

我还会看看Apache Ignite,用于SQL查询的流数据。我自己从来没有用过,但我听说过好东西。

相关内容

  • 没有找到相关文章

最新更新