聚合用例-按两个不同的Kafka流分组并计算平均值

时间:2020-08-20 06:22:37

标签: apache-kafka-streams

我被困在一个用例中。我需要计算娱乐花费的百分比。

在我的信息流中,我获得了包含行业代码和花费金额的记录(行业代码是基于娱乐和非娱乐性的)

例如娱乐业代码>行业代码金额

                                                         157       100

                                                         257        200

                                                         157         300

非娱乐行业代码>行业代码金额

                                                         457       100

                                                          657       200

                                                          457       300

所以我需要计算娱乐花费的百分比,应该是娱乐量的总和/(娱乐量的总和非娱乐量的总和)

我正在尝试的解决方案:创建两个Ktables一个娱乐组,按娱乐代码分组,即 157400(100 + 300)

                                   257    100

不再娱乐另一个KTable 457 400

                                 657      200

我现在有两个KTable,但是如何计算%?这种方法正确吗?

1 个答案:

答案 0 :(得分:0)

我不完全确定您到目前为止到底尝试了什么。当您创建两个表时,两个表是否都有多行(即每个代码行)或者您是否已经“合并”了不同的代码?如果每个表包含多行,则需要通过设置一个组合的代理键(例如所有行的整数值 0)将所有行聚合在一起:

KStream sumSpendingEntertainment = spendingEntertainment.groupBy((k,v) -> 0)
                                                        .aggregate(...);
KStream sumSpendingAll = spendingAll.groupBy((k,v) -> 0)
                                    .aggregate(...);

最后,在一行中得到两个 KTable;一个包含总支出,一个包含“娱乐支出”,两个 KTable 将使用相同的组合代理键(在我们的示例中为整数 0)。

在最后一步,您可以连接两个表以除以两个总和:

sumSpendingEntertainment.join(sumSpendingAll,
                              (sumEnt, sumAll) -> sumEnt / sumAll); // this is the `ValueJoiner` expressed as lambda