0

我完全绝望了!

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

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

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

视觉示例:

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

satastream2----- 米奇 M.、约翰 L.、安东尼布朗

数据流 d3=datastream1.union(datastream2)

d3.key 按分数/相似,而不是确切的名称。

希望大家理解,谢谢!

4

2 回答 2

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 - 确定性的键

于 2021-05-12T09:56:13.590 回答
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

于 2016-06-10T16:41:28.473 回答