java - 如何在 Apache Beam Java SDK 中的多个列上使用 aggregateField()?
问题描述
在 Apache Beam Python SDK 中,可以执行以下操作:
input
| GroupBy(account=lambda s: s["account"])
.aggregate_field(lambda x: x["wordsAddup"] - x["wordsSubtract"], sum, 'wordsRead')
我们如何在 Java SDK 中执行类似的操作?奇怪的是,编程指南中只有 Python中用于此转换的示例。
这是我在 Java 中生成等效项的尝试:
input.apply(
Group.byFieldNames("account")
.aggregateField(<INSERT EQUIVALENT HERE>, Sum.ofIntegers(), "wordsRead"));
解决方案
https://beam.apache.org/documentation/programming-guide/#using-schemas中有一些 Java 示例。(请注意,您可能必须选择java
同时具有 Java 和 Python 的选择器上的选项卡才能看到它们。)
在 Java 中,我不认为 aggregateField 的第一个参数可以采用任意表达式;它必须是字段名称。您可以使用为所需表达式添加新字段的投影来继续分组操作。例如
input
.apply(SqlTransform.query(
"SELECT *, wordsAddup - wordsSubtract AS wordsDiff from PCOLLECTION")
.apply(Group.byFieldNames("account")
.aggregateField("wordsDiff", Sum.ofIntegers(), "wordsRead"));
推荐阅读
- node.js - 在 node-js selenium-webdriver 中单击 SHIFT+CTRL+S
- c# - MongoDB C#最后对空值进行排序
- angular - Ng bootstrap 未安装在 Angular 13 上
- json - 对 bash 中的 json 响应进行排序
- html - 在我的 div 类之间放置空间并对齐它们
- terraform - 如何使用 for 循环连接 Terraform 输出中的字符串?
- logging - Eclipse、动态 Web 应用程序、Wildfly log4j 日志记录
- reactjs - React router bootstrap LinkContainer returns TypeError: (0 , _reactRouterDom.withRouter) is not a function
- docker-compose - Pika:意外帧,Channel.OpenOk
- javascript - 在没有 webpack 的情况下将 vue-videobg 添加到 vuetify (cdn)