我正在尝试使用Jet进行汇总,源和接收器都是Kafka主题,要求是从源中获取GPB(google proto buf)消息并发布GPB消息。问题是我可以发布Double
,但不能发布GPB消息,这给了我编译错误。
这很好:
Pipeline p = Pipeline.create();
p.drawFrom(KafkaSources.<String, Balance> kafka(<properties>, <topic>))
.map(s->s.getValue() ).groupingKey(x->x.account)
.rollingAggregator(AggregateOperations.summingDouble(Balance::amount))
.drainTo(KafkaSinks.kafka(<prop>,<sinktopic>));
即使以上代码可以正常工作,它也会发布double
来沉没主题,而我的要求是发布具有double
属性的GPB来沉没主题。
当我尝试通过在map
之前放置drainTo
来做到这一点时,它给了我语法错误。下面是我尝试过的:
.rollingAggregator(AggregateOperation.summingDouble(Balance::amount))
.map(k->Amount.newBuilder().setAmount(k.getValue()).build())
.drainTo(KafkaSinks.kafka(<prop>,<sinktopic>));
金额是具有double
属性的GPB消息。这给了我我不理解的语法错误。您能帮我解决这个问题吗?
在不同情况下有不同汇总的地方,您还可以共享一些文档或链接吗?我浏览了Hazelcast示例,演示,不是全部,而是很少,但是在那里找不到我的用例。非常感谢。
答案 0 :(得分:0)
我猜语法错误是这样的:
不兼容的类型。需要水槽<? super Amount>,但将'kafka'推断为Sink
>:不存在类型变量K,V的实例,因此String符合Entry
(下一次,请共享该异常,您的代码具有对非共享类的依赖关系,而我无法对其进行编译。)
这意味着Kafka接收器期望输入时输入java.util.Map.Entry
,但您给了Amount
。您需要通过以下方式map
:
.map(entry-> Util.entry(entry.getKey(), Amount.newBuilder().setAmount(entry.getValue()).build()))