ApacheFlink,键控两个字段字符串值相似但不相同的数据流



我完全绝望了!

我将apache-flink与java结合使用,我想知道是否可以修改keyby方法,以便通过相似性而不是确切的名称进行键控?

我有两个不同的数据流,我正在进行一个并集。在第一个流中,我想要KeyBy的字段的名称是"John Locke",而在第二个数据流中,字段值是"John L"。

我有一个算法,可以在一些不同的字符串之间给我打分。我的想法是:例如,如果两个字符串之间的分数都高于0'80,那么这两个字符串将被认为是相同的,当我应用keyby("name")时,这些相似的字符串将被键入,因为它们具有完全相同的名称。

视觉示例:

数据流1-John Locke、Mickey Micke、Will Williams

撒旦流2---米奇·M、约翰·L、安东尼·布朗

数据流d3=数据流1.union(数据流2)

d3.根据分数/相似性,而不是确切的名字。

我希望你能理解,谢谢

我认为您的需求很难有效地实现。原因如下:

  • sim(A,B)=0.9
  • sim(A,D)=sim(B,D)=0.7
  • sim(A,C)=0.9
  • sim(C,D)=0.9

如果元素的顺序是A、B、D、C,则必须在事件C到达时重新分区。通常,组可以随着每个到达的元素而变化。

或者,你可以使用KeySelector,它可以进行某种词干、正则化,并在n 上键入

只要密钥具有确定性,就可以使用密钥选择器这里有一个基本的例子,名字总是跟在姓氏后面。

密钥选择器将一个值或一组值转换为识别数据流中集合的密钥

将其放置在keyby函数中或创建一个类

new KeySelector<String, String key>() {
@Override
public Object getKey(String value) throws Exception {
String[] fullnameArr = value.split(" ");
String[] NameChar = fullnameArr[fullnameArr.length-1].split("");



return FullnameArr[0] + NameChar[0];
} 

因此,所有名称都将导致JohnL、TomT、CarlS、TonyI-确定性密钥

相关内容

  • 没有找到相关文章

最新更新