在将KStream与GlobalKTable结合在一起时,我遇到了一个问题,非常感谢您的帮助。
给出两个卡夫卡主题orders
和customers
:
订单
"1" {"ID":"1","Name":"Myorder1","CustID":"100"}
"2" {"ID":"2","Name":"MyOrder2","CustID":"200"}
客户
"100" {"CustID":"100","CustName":"Customer1"}
"200" {"CustID":"200","CustName":"Customer2"}
要求是使用客户名称丰富订单流
"1" {"ID":"1","Name":"Myorder1","CustID":"100","CustName":"Customer1"}
"2" {"ID":"2","Name":"MyOrder2","CustID":"200","CustName":"Customer2"}}
我正在尝试以下操作:
orders
主题构建KStream customers
主题构建GlobalKTable KStream<String, EnrichedOrder> enrichedstreams = orders.join(
customers,
new KeyValueMapper<String, Order, String>() {
@Override
public String apply(String key, Order value) {
return value.CustID;
}
},
new ValueJoiner<Order,Customer, EnrichedOrder>() {
@Override
public EnrichedOrder apply(Order order, Customer customer) {
EnrichedOrder eorder = new EnrichedOrder();
eorder.CustID = order.CustID;
eorder.CustName = customer.CustName;
eorder.ID = order.ID;
eorder.Name = order.Name;
return eorder;
}
}
);
但是它不会给出任何结果,也不会引发任何异常。
使用leftJoin
时,我收到了客户的NullPointer异常。
如果您遇到类似的问题,请告诉我,并提出解决方法。
答案 0 :(得分:1)
让我们仔细查看复制粘贴的内容:
在customers
主题中:
"100" {"CustID":"100","CustName":"Customer1"}
您会注意到密钥是一个字符串,并且此字符串包含双引号:"100"
。通常,字符串键打印时不带双引号。我更希望看到:
100 {"CustID":"100","CustName":"Customer1"}
换句话说,密钥的Java String表示形式是""100""
(或"\"100\""
),而不是我们期望的"100"
。
另一方面,您的orders
主题中的值是一个Json {"ID":"1","Name":"Myorder1","CustID":"100"}
,而属性CustID
是一个String,这一次用Java "100"
表示。
当您加入orders
和customers
时,您尝试将订单CustID 100
与客户密钥"100"
进行匹配。而且由于CustID中缺少密钥中的双引号,因此将失败。
答案 1 :(得分:0)
@deepak,您可能需要实现KTable
builder.table(customers, Materialized.as(customerStore));
然后流式传输订单并建立您的加入。