Apache Flink,关键的两个数据流,具有相似的字段字符串值但不相同

时间:2016-06-08 17:47:01

标签: java apache-flink flink-streaming

我非常绝望!

我正在使用apache flink和java,我想知道是否可以修改keyby方法以便通过相似性而不是确切的名称来键入?

我有两个不同的DataStream,我正在做一个联合。在第一个流中,我想要KeyBy的字段的名称是“John Locke”,而在第二个Datastream中,字段值是“John L”。

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

视觉示例:

datastream1 ----- John Locke,Mickey Micke,Will Williams

satastream2 ----- Mickey M.,John L.,Anthony Brown

Datastream d3 = datastream1.union(datastream2)

d3.keyby得分/类似,而不是确切的名称。

我希望你理解, 谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您的要求很难有效实施。原因如下:

  • 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

答案 1 :(得分:0)

只要键是确定性的,您就可以使用键选择器 这是一个基本示例,因为名字总是跟在姓氏之后。

键选择器将一个值或一组值转换为一个键,该键标识数据流中的集合

把它放在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 - 确定性键