Kafka Stream和KGlobalTable Join问题

时间:2019-06-04 04:59:36

标签: java apache-kafka apache-kafka-streams

在将KStream与GlobalKTable结合在一起时,我遇到了一个问题,非常感谢您的帮助。

给出两个卡夫卡主题orderscustomers

订单

"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"}}

我正在尝试以下操作:

  1. orders主题构建KStream
  2. customers主题构建GlobalKTable
  3. 构建另一个连接Orders和Customer的流(在Customer表中查找Order.CustID)
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异常。

如果您遇到类似的问题,请告诉我,并提出解决方法。

2 个答案:

答案 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"表示。

当您加入orderscustomers时,您尝试将订单CustID 100与客户密钥"100"进行匹配。而且由于CustID中缺少密钥中的双引号,因此将失败。

答案 1 :(得分:0)

@deepak,您可能需要实现KTable

builder.table(customers, Materialized.as(customerStore));

然后流式传输订单并建立您的加入。