Apache flink 如何在flink中实现KGroupTable用例

Apache flink 如何在flink中实现KGroupTable用例,apache-flink,apache-kafka-streams,Apache Flink,Apache Kafka Streams,我正在flink上做一些poc,但我找不到关于如何实现类似于kafka流中KGroupTable的用例的文档,如下所示 KTable<byte[], Long> aggregatedStream = groupedTable.aggregate(() -> 0L, (aggKey, newValue, aggValue) -> aggValue + newValue.length(), (aggKey, oldValue, aggValue) -> aggValue

我正在flink上做一些poc,但我找不到关于如何实现类似于kafka流中KGroupTable的用例的文档,如下所示

KTable<byte[], Long> aggregatedStream = groupedTable.aggregate(() -> 0L,
(aggKey, newValue, aggValue) -> aggValue + newValue.length(),
(aggKey, oldValue, aggValue) -> aggValue - oldValue.length(),  Serdes.Long(),     "aggregation-table-store");
在上面的例子中,第四次更新是,我得到了现有事务#1的更新,因此它将删除旧余额(1000)并添加新余额(500)


谢谢

这里是一个你可以如何实现这一目标的草图。我使用元组是因为我懒惰;最好使用POJO

import org.apache.flink.api.common.functions.RichMapFunction;
导入org.apache.flink.api.common.state.MapState;
导入org.apache.flink.api.common.state.MapStateDescriptor;
导入org.apache.flink.api.common.state.ReducingState;
导入org.apache.flink.api.common.state.ReduceingStateDescriptor;
导入org.apache.flink.api.java.tuple.Tuple2;
导入org.apache.flink.api.java.tuple.Tuple3;
导入org.apache.flink.configuration.configuration;
导入org.apache.flink.streaming.api.datastream.DataStreamSource;
导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
带撤销的公共类交易{
公共静态void main(字符串[]args)引发异常{
最终StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource rawInput=env.fromElements(
新元组3(1,“account1”,1000.0F),
新元组3(2,“account1”,2000.0F),
新元组3(3,“account2”,2000.0F),
新元组3(1,“account1”,500.0F)
);
原始输入
.keyBy(t->t.f1)
.map(新的ManageAccounts())
.print();
execute();
}
公共静态类ManageAccounts扩展了RichMapFunction{
MapStateDescriptor事务描述;
还原状态描述符平衡描述;
@凌驾
公共void open(配置参数)引发异常{
TransactionDescrc=新的MapStateDescriptor(“事务”,Integer.class,Float.class);
balanceDesc=新的还原状态描述符(“balance”,(f,g)->f+g,Float.class);
}
@凌驾
公共Tuple2映射(Tuple3事件)引发异常{
MapState事务=getRuntimeContext().getMapState(TransactionDescrc);
ReductionState balance=getRuntimeContext().GetReductionState(balanceDesc);
Float currentValue=transactions.get(event.f0);
if(currentValue==null){
currentValue=0F;
}
事务处理.put(event.f0,event.f2);
余额。添加(事件f2-当前值);
返回新的Tuple2(event.f1,balance.get());
}
}
}
运行时,将生成:

1> (account1,1000.0)
8> (account2,2000.0)
1> (account1,3000.0)
1> (account1,2500.0)

请注意,此实现使所有事务始终处于状态,这在实际应用程序中可能会出现问题,尽管您可以将Flink状态扩展为非常大的状态。

我想要的是不同的东西,更新了问题中的一个示例我已经重写了我的答案。在这种情况下,kafka streams是否更好,因为它是开箱即用的,并且在内部主题中管理所有此类状态?对此类情况的支持正在添加到Flink的Table/SQL API中,我相信将包含在即将发布的Flink 1.11版本中。有关详细信息,请参阅。这应该可以提供您想要的易用性。感谢您的更新,以及您共享的代码,它是否具有容错性,如在集群重新启动或一个节点出现故障的情况下,getRuntimeContext将返回正确的MapState和ReductionState
1> (account1,1000.0)
8> (account2,2000.0)
1> (account1,3000.0)
1> (account1,2500.0)