message 1:{其他字段:{...},字段1:“abc”,field2:“def”} message2:{其他字段:{...},字段1:“def”,field2:“abc”}
在Flink中,如果我们keyBy来自Kafka Topic的流,如果我们keyBy基于field 1和field 2,那么上面的2条消息将进入不同的keyed-state,但我希望它们进入相同的keyed-state。
我现在的代码是这样的:
streams
.keyBy(GroupByKeyGenerator())
.process(CustomProcessFunction())
我的一个解决方案是将两个字段合并为一个,按升序排列,然后将其作为一个键用于keyBy流。这样,两个消息将进入相同的键控状态。(两种情况下的键都是abcdef)
但问题是,这两个密钥是uuid,它们也是从源随机生成的。如果我把它们组合起来,并按升序排列,那么它们将被Map到相同键状态下的不同类别/键组的机会有多大?
举例来说:
消息1:字段1:aef,字段2:bcd => combinedOrderedKey:ABCDEF
消息2:字段1:abc,field2:def => combinedOrderedKey:ABCDEF
combinedKey将是相同的,但它们不是同一组/keyed-state的一部分。
请帮助我找到我可以使用的解决方案。(一些哈希函数可以使用?)
1条答案
按热度按时间lmyy7pcs1#
解决上述问题的最简单方法是:
1.把这两个键放在一个列表中
1.对列表进行排序
1.在键之间放置任何分隔符(按排序顺序)
1.这将作为各州的通用密钥。
示例:message 1:{key1:“bcf”,key2:“adf”}消息1:{key1:“adf”,key2:“bcf”}
在这两种情况下,关键是:adf_bcf步骤:
1.[英国信贷基金、亚洲信贷基金]
1.[亚洲发展基金,英国货币基金]
1.公用键:adf_bcf