首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自一个流的几个不同字段的平均值

来自一个流的几个不同字段的平均值
EN

Stack Overflow用户
提问于 2019-04-16 08:19:44
回答 1查看 51关注 0票数 0

我还没有选择一个流媒体框架,但我现在正在摆弄Flink。但是,我对使用Beam,Spark Streaming持开放态度,无论我发现什么适合我的用例。您将如何执行与以下SQL相当的操作:

代码语言:javascript
复制
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,Structured Streaming等让这一切变得更容易?

顺便说一句,有没有一种简单的方法可以从Postgres中模拟这个漂亮的小计数过滤器语法,

代码语言:javascript
复制
SELECT
  COUNT(*) AS unfiltered,
  COUNT(*) FILTER (WHERE some_condition) AS filtered
FROM whatever
EN

回答 1

Stack Overflow用户

发布于 2019-04-16 22:48:16

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

代码语言:javascript
复制
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查询流式传输数据。我自己从来没有用过它,但我听说过一些好的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55698889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档