Java 复合聚集
我有一个主题中的数据需要在多个级别进行统计,所有代码和文章都只提到单词统计示例 数据的一个例子是: 序列号:123 国家:美国 日期:2018年5月1日 州:纽约 城市:纽约 参观人数:5人 序列号:123 国家:美国 日期:2018年6月1日 州:纽约 城市:皇后区 参观者:10人 序列号:456 日期:2018年6月1日 国家:美国 州:纽约 城市:皇后区 访客:27 序列号:123 日期:2018年6月1日 国家:美国 州:纽约 城市:纽约 参观者:867 我已经做了过滤,但聚合? 对于Java8和&mix,我很抱歉,我更喜欢8,但同时学习它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
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()