Java KStream GlobalKTable联接能否为特定搜索返回多个匹配记录?

Java KStream GlobalKTable联接能否为特定搜索返回多个匹配记录?,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我希望有人能帮我解决一个关于卡夫卡GlobalKTables的问题 我正在尝试执行KStream GlobalKTable联接。但是,我希望检索GlobalKTable中的所有条目,这些条目的键或值包含在原始流事件中找到的字符串。例如,假设我的表有3行,其中包含以下键: Key: BANK055DEPOSIT value: {some data} Key: BANK055CREDIT value: {different data} Key: BANK033CREDIT value: {mor

我希望有人能帮我解决一个关于卡夫卡GlobalKTables的问题

我正在尝试执行KStream GlobalKTable联接。但是,我希望检索GlobalKTable中的所有条目,这些条目的键值包含在原始流事件中找到的字符串。例如,假设我的表有3行,其中包含以下键:

Key: BANK055DEPOSIT value: {some data}
 Key: BANK055CREDIT value: {different data}
 Key: BANK033CREDIT value: {more different data}
当我在表上执行联接以检索数据时,我需要回调其键值包含“055”的所有行。所以我想要前两排

在数据库世界中,这相当于以下内容:

SELECT * FROM GlobalKTable where table_key.contains("055”) OR table_value.contains(“055”)
我浏览了官方文件,没有找到如何做到这一点的例子。我怀疑从GlobalKTable联接检索N个行是不可能的

此外,我正在使用streams DSL进行此操作。不确定使用处理器API是否可以实现这一点。 欢迎您的任何意见

当使用时,您可以使用
KStream的部分键和值,
,但它必须最终匹配整个
GlobalKTable
键,因此,不幸的是,您无法使用联接执行上述操作

但是,即使使用DSL,您也应该能够做到这一点。如果使用,则可以扫描statestore并根据流记录中包含的子字符串提取所需的记录。此外,您不一定需要扫描整个商店,而是使用一个

编辑:这里有一些代码,我用它来演示我的意思

@SuppressWarnings(“未选中”)
公共类MultiResultJoinExample{
公共静态void main(字符串[]args){
最终属性道具=新属性();
put(StreamsConfig.APPLICATION_ID_CONFIG,“mult partial key join results”);
put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”);
最终StreamsBuilder生成器=新StreamsBuilder();
最终字符串storeName=“kv store”;
最终StoreBuilder键值StoreBuilder=
Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(storeName),
Serdes.String(),
Serdes.String());
builder.addStateStore(keyValueStoreBuilder);
final KStream streamtojoincountry=builder.stream(“要加入输入”,已消耗).with(Serdes.String(),Serdes.String());
transformValues(新的StoringValueTransformer(storeName)、storeName);
最终KStream streamNeedingJoin=builder.stream(“需要连接输入”,consumered.with(Serdes.String(),Serdes.String());
streamNeedingJoin.flatTransformValues(新的FlatMapJoiningTransformer(storeName),storeName).to(“输出”,生成的.with(Serdes.String(),Serdes.String());
最终KafkaStreams streams=新的KafkaStreams(builder.build(props),props);
streams.start();
}
静态最终类FlatMapJoiningTransformer使用KeySupplier实现ValueTransformer{
最终字符串storeName;
公共FlatMapJoiningTransformer(字符串存储名){
this.storeName=storeName;
}
@凌驾
public ValueTransformerWithKey get(){
返回新值TransformerWithKey(){
私钥存储;
@凌驾
公共void init(ProcessorContext上下文){
kvStore=(KeyValueStore)context.getStateStore(storeName);
}
@凌驾
公共Iterable转换(字符串readOnlyKey,字符串值){
列表结果=新建ArrayList();
最终字符串模式匹配=readOnlyKey.substring(4,7);
try(KeyValueIterator iter=kvStore.all()){
while(iter.hasNext()){
最终键值kv=iter.next();
if(千伏键包含(图案匹配)| |千伏值包含(图案匹配)){
结果。添加(千伏值+“-”+值);
}
}
}
返回结果;
}
@凌驾
公众假期结束(){
}
};
}
}
静态最终类StoringValueTransformer实现带键供应商的ValueTransformer{
最终字符串storeName;
公共存储ValueTransformer(字符串存储名){
this.storeName=storeName;
}
@凌驾
public ValueTransformerWithKey get(){
返回新值TransformerWithKey(){
私钥存储;
@凌驾
公共void init(ProcessorContext上下文){
kvStore=(KeyValueStore)context.getStateStore(storeName);
}
@凌驾
公共字符串转换(字符串readOnlyKey,字符串值){
kvStore.putIfAbsent(readOnlyKey,value);
返回值;
}
@凌驾
公众假期结束(){
//无操作
}
};
}
}
}
嗯,,
Bill

您只能使用KTable和GlobalKTable中的键执行表查找(精确匹配不包含),而不是在使用value时,要执行此操作,您必须将记录添加到GlobalKTable中,其中键是上一条消息的值