我有以下情况:
a
,为表B发出一个事件b
。leftJoin
KStreams A和B。(让我们假设a
和b
记录具有相同的键并落在联接窗口中)。[a, null], [a, b]
。如何丢弃[a, null]
?
一种选择是执行innerJoin
,但是在进行update
查询的情况下仍然是个问题。
我们尝试使用事件时间戳进行过滤(即,使事件保持最新的时间戳),但不能保证时间戳的唯一性。
即。最终目标是能够识别最新的汇总,以便我们可以在查询时(在Athena / Presto或某些RDBMS中)过滤掉中间结果。
答案 0 :(得分:0)
目前,我发现最好的工作方法是利用输出记录中的Kafka偏移量。
该方法可以概括为:
context.offset()
通过Kafka偏移量丰富消息。现在,您的输出主题包含多条针对同一键的消息,但每条消息具有不同的偏移量。
现在在查询期间,您可以使用子查询为每个键选择最大偏移量。
下面可以看到一个示例TransformerSupplier
/**
* @param <K> key type
* @param <V> value type
*/
public class OutputTransformSupplier<K, V> implements TransformerSupplier<K, V, KeyValue<String, String>> {
@Override
public Transformer<K, V, KeyValue<String, String>> get() {
return new OutputTransformer<>();
}
private class OutputTransformer<K, V> implements Transformer<K, V, KeyValue<String, String>> {
private ProcessorContext context;
@Override
public void init(ProcessorContext context) {
this.context = context;
}
/**
* @param key the key for the record
* @param value the value for the record
*/
@Override
public KeyValue<String, String> transform(K key, V value) {
if (value != null) {
value.setKafkaOffset(context.offset());
}
return new KeyValue<>(key, value);
}
@Override
public KeyValue<String, String> punctuate(long timestamp) {
return null;
}
@Override
public void close() {
// nothing to close
}
}
}