如何在Apache Beam Java SDK中对多列使用aggregateField()?

如何在Apache Beam Java SDK中对多列使用aggregateField()?,java,apache-beam,Java,Apache Beam,在Apache Beam Python SDK中,可以执行以下操作: 输入 |GroupBy(帐户=lambda s:s[“帐户”]) .aggregate_字段(lambda x:x[“wordsAddup”]-x[“wordsSubtract”],总和,'wordsRead') 我们如何在JavaSDK中执行类似的操作?奇怪的是,《编程指南》对这一转换没有明确的定义 以下是我尝试用Java生成等价物的过程: input.apply( Group.byFieldNames("acc

在Apache Beam Python SDK中,可以执行以下操作:

输入
|GroupBy(帐户=lambda s:s[“帐户”])
.aggregate_字段(lambda x:x[“wordsAddup”]-x[“wordsSubtract”],总和,'wordsRead')
我们如何在JavaSDK中执行类似的操作?奇怪的是,《编程指南》对这一转换没有明确的定义

以下是我尝试用Java生成等价物的过程:

input.apply(
Group.byFieldNames("account")
.aggregateField(<INSERT EQUIVALENT HERE>, Sum.ofIntegers(), "wordsRead"));
input.apply(
组。按字段名称(“帐户”)
.aggregateField(,整数总和(),“wordsRead”);

上有一些Java示例。(注意,您可能必须在同时具有java和Python的选择器上选择
java
选项卡才能查看它们。)

在Java中,我认为aggregateField的第一个参数不能采用任意表达式;它必须是字段名。可以使用为所需表达式添加新字段的投影继续分组操作。比如说

input
    .apply(SqlTransform.query(
        "SELECT *, wordsAddup - wordsSubtract AS wordsDiff from PCOLLECTION")
    .apply(Group.byFieldNames("account")
        .aggregateField("wordsDiff", Sum.ofIntegers(), "wordsRead"));

非常感谢。虽然这是编程指南的主页。似乎没有一个与Python类似的单独页面专门讨论同一转换本身的完整示例(参见问题中的超链接)。如果您能进一步阐述“您可以使用为所需表达式添加新字段的投影来进行分组操作”的含义,我将不胜感激。您是指获取所需列的整个PTransforms算法吗?如果有执行所需任务的代码示例,我会将此标记为正确答案。添加了一个示例,希望能有所帮助。