Queryble过滤的KTable

时间:2019-05-31 08:06:56

标签: apache-kafka aggregation apache-kafka-streams

这里是我制作的示例KTable,它是一个简单的汇总:

String name = stream
    .groupByKey()
    .aggregate(
        () -> new Aggregate(config),
        (key, value, aggregate) -> aggregate.addAndReturn(value),
        Materialized
            .<String, Aggregate>as(Stores.inMemoryKeyValueStore(config.OutputStore()))
            .withCachingEnabled()
            .withKeySerde(Serdes.String())
            .withValueSerde(CustomSerdes.ObjectSerde()))
    .filter(((key, value) -> value.isStateChanged()))
    .filter((key, value) -> !value.getRecentlyViewed().isEmpty())
    .queryableStoreName();

我需要做的是将最后一个KTable(在应用过滤后)存储在状态存储中,而不是最初的KTable。当前KTable.queryableStoreName()返回null

我当前的解决方案是应用filter(),然后使用KTable.toStream()转换为流,最后再次存储为KTable,我认为这样效率不高。还有其他解决办法

1 个答案:

答案 0 :(得分:0)

您可以通过提供可查询的商店名称来强制实现KTable的实现:

.aggregate()
.filter(..., Materialized.as("your-custom-store-name"));

根据您使用的版本,您可能需要指定一些泛型才能进行编译:

Materialized<KEY_TYPE, VALUE_TYPE, KeyValueStore<Bytes, byte[]>>.as("your-custom-store-name"))