Java 复合聚集

Java 复合聚集,java,apache-kafka-streams,Java,Apache Kafka Streams,我有一个主题中的数据需要在多个级别进行统计,所有代码和文章都只提到单词统计示例 数据的一个例子是: 序列号:123 国家:美国 日期:2018年5月1日 州:纽约 城市:纽约 参观人数:5人 序列号:123 国家:美国 日期:2018年6月1日 州:纽约 城市:皇后区 参观者:10人 序列号:456 日期:2018年6月1日 国家:美国 州:纽约 城市:皇后区 访客:27 序列号:123 日期:2018年6月1日 国家:美国 州:纽约 城市:纽约 参观者:867 我已经做了过滤,但聚合? 对于J

我有一个主题中的数据需要在多个级别进行统计,所有代码和文章都只提到单词统计示例

数据的一个例子是:

序列号:123 国家:美国 日期:2018年5月1日 州:纽约 城市:纽约 参观人数:5人

序列号:123 国家:美国 日期:2018年6月1日 州:纽约 城市:皇后区 参观者:10人

序列号:456 日期:2018年6月1日 国家:美国 州:纽约 城市:皇后区 访客:27

序列号:123 日期:2018年6月1日 国家:美国 州:纽约 城市:纽约 参观者:867

我已经做了过滤,但聚合? 对于Java8和&mix,我很抱歉,我更喜欢8,但同时学习它

KTable<String, CountryVisitorModel> countryStream1 = inStream
    .filter((key, value) -> value.status.equalsIgnoreCase("TEST_DATA"))
    .groupBy((key, value) -> value.serial)
    .aggregate(
            new Initializer<CountryVisitorModel>() {

            public CountryVisitorModelapply() {
                return new CountryVisitorModel();
            }
        },
        new Aggregator<String, InputModel, CountryVisitorModel>() {

            @Override
            public CountryVisitorModelapply(String key, InputModel value, CountryVisitorModel aggregate) {

    aggregate.serial = value.serial;
    aggregate.country_name = value.country_name;
    aggregate.city_name = value.city_name;

    aggregate.country_count++;
    aggregate.city_count++;
    aggregate.ip_count++;

        //
    return aggregate;
       }
},
Materialized.with(stringSerde, visitorSerde));

KTable countryStream1=流内
.filter((键,值)->value.status.equalsIgnoreCase(“测试数据”))
.groupBy((键,值)->value.serial)
.合计(
新初始值设定项(){
public CountryVisitorModelapply(){
返回新的CountryVisitorModel();
}
},
新聚合器(){
@凌驾
public CountryVisitorModelapply(字符串键、InputModel值、CountryVisitorModel聚合){
aggregate.serial=value.serial;
aggregate.country\u name=value.country\u name;
aggregate.city\u name=value.city\u name;
合计。国家/地区计数++;
聚合。城市计数++;
聚合.ip_计数++;
//
总回报;
}
},
具体化。使用(stringSerde,visitorSerde));
对于所有相同的序列号(这将是分组依据) 计算每个站点的访客总数:


连续国家/州/城市总访客数

如果每个记录只占一个计数,我建议
branch()
流和每个子流的计数:

KStream stream=builder.stream(…)
KStream[]subStreams=stream.branch(…);
//“stream”的每个记录都将精确地包含在一个子流中`
子流[0]。grouByKey().count();//或聚合()而不是计数()
子流[1]。grouByKey().count();
// ...
如果分支不起作用,因为单个记录需要进入多个计数,您可以“广播”和过滤:

KStream stream=builder.stream(…)
//`stream`中的每个记录都将被“复制”并发送到所有`filters``
stream.filter(…).grouByKey().count();//或聚合()而不是计数()
stream.filter(…).grouByKey().count();
// ...
使用相同的
KStream
多次对象并应用多个操作符(在我们的例子中
filter()
,每个记录都将“广播”给所有操作符)。请注意,在这种情况下,记录(即对象)不是物理复制的,而是使用相同的输入记录对象来调用每个
filter()