我在主题中有下一个值
// 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
,但是Photo
是null
但是我不明白为什么?以及如何避免它。
答案 0 :(得分:1)
使用 leftJoin ,您可以在ValueJoiner
apply
方法中使用空照片值。
对于users
流的每个不满足连接谓词的输入记录,将使用photo_by_user
流的空值调用提供的ValueJoiner。
在Result.from()
方法内,您需要检查Photo实例是否为非null,只有在获取Photo的字段ID和url之后,才能检查该实例。
您还没有加入JoinWindows.of(1L)
,其中1表示毫秒。
请注意,只有在两个记录的时间戳彼此接近时(根据指定的JoinWindows
定义),两个记录才被连接。在您的情况下,有可能两个记录创建的时间不完全相同,因此请尝试增加价值,例如10000L测试您的加入逻辑。