首页 > 解决方案 > Kafka Streams DSL 折叠分层数据

问题描述

使用 Kafka Streams DSL,这就是我想要做的:

输入消息 Serdes:Avro 用于键和值键:使用字段 L1、L2、L3 记录值:使用值 V 记录(在本例中为 int)

我想要做的是折叠这种层次结构,使生成的流具有正确的汇总值。例如,

Input:
L1   L2   L3  V
a1   b1   c1  v1
a1   b1   c2  v2
a1   b2   c1  v3
a1   b2   c2  v4
a2   b1   c1  v5



Output 1: (Data wanted at L1, L2)
L1   L2   V
a1   b1   v1 + v2
a1   b2   v3 + v4
a2   b1   v5

Output 2 (Data wanted at L1)
L1    V
a1    v1 + v2 + v3 + v4
a2    v2

Streams DSL 有没有办法允许这样?请注意,所有输出的键类型都发生了变化,我找不到执行这些 rekey + 聚合的方法(因为 rekey 本质上应该合并多个值)。虽然可能有一些方法可以使用处理器 API 或基本的 Kafka 消费者来实现这一点,但想要检查如何在 DSL 中做到这一点(如果可能的话)。

标签: apache-kafkaapache-kafka-streams

解决方案


您应该能够使用selectKey()

KStream input = builder.stream(...);
input.selectKey(/*create a new output record with only 2 attributes L1 and L2*/)
     .groupyByKey()
     .aggregate(...);

input.selectKey(/*create a new output record with only 1 attribute L1*/)
     .groupByKey()
     .aggregate(...)

推荐阅读