kafka-stramsleft加入生产NPE

时间:2018-07-08 15:41:59

标签: apache-kafka-streams

我在主题中有下一个值

// photos
1, {"id": 1, user_id: 1, "url": "http://example.com"}
2, {"id": 2, user_id: 2, "url": "http://example1.com"}
3, {"id": 3, user_id: 1, "url": "http://example2.com"}

// users
1, {"id": 1, "name": "user1"}
2, {"id": 2, "name": "user2"}

我想获取信息:[photo_id, photo_url, user_id, user_name]

我为此实现了Result类

 public class Result {
  public int photo_id;
  public String photo_url;
  public int user_id;
  public String user_name;

  public static Result from(Photo photo, User user) {
    Result r = new Result();
    r.photo_id = photo.id;
    r.photo_url = r.url;
    r.user_id = user.id;
    r.user_name = user.name;
    return r;
  }
 }

我的流实现:

final KStream<Integer, Photo) photo_by_user = ...;
final KStream<Integer, User) users = ...;

users.leftJoin(photo_by_user, new ValueJoiner<User, Photo, Result> {
  public Result apply(User user, Photo photo) {
    return Result.from(user, photo);
  }
}, JoinWindows.of(1L))

但是当我运行这段代码时,我得到了:

    Exception in thread "example-StreamThread-1" java.lang.NullPointerException
  at myapps.util.Result.create(Result.java:15)
  at myapps.Example$1.apply(Example.java:56)
  at myapps.Example$1.apply(Example.java:53)
  at org.apache.kafka.streams.kstream.internals.KStreamKStreamJoin$KStreamKStreamJoinProcessor.process(KStreamKStreamJoin.java:87)
  at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46)

因为User have a value,但是Photonull

但是我不明白为什么?以及如何避免它。

1 个答案:

答案 0 :(得分:1)

使用 leftJoin ,您可以在ValueJoiner apply方法中使用空照片值。

对于users流的每个不满足连接谓词的输入记录,将使用photo_by_user流的空值调用提供的ValueJoiner。

Result.from()方法内,您需要检查Photo实例是否为非null,只有在获取Photo的字段ID和url之后,才能检查该实例。

您还没有加入JoinWindows.of(1L),其中1表示毫秒。 请注意,只有在两个记录的时间戳彼此接近时(根据指定的JoinWindows定义),两个记录才被连接。在您的情况下,有可能两个记录创建的时间不完全相同,因此请尝试增加价值,例如10000L测试您的加入逻辑。