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

时间:2019-04-16 00:19:44

标签: apache-spark-sql spark-streaming apache-flink apache-beam flink-streaming

我还没有选择流媒体框架,但是我现在正在搞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而言,似乎可以通过AggregateFunction 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

1 个答案:

答案 0 :(得分:1)

通常在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查询流式传输数据。我从未亲自使用过它,但是我听过好东西。