簡體   English   中英

Apache Flink,用相似的字段字符串值鍵控兩個數據流但不相同

[英]Apache Flink, key two datastreams with similar field string value but NOT the same

我完全絕望了!

我正在將 apache flink 與 java 一起使用,我想知道是否可以修改 keyby 方法以便通過相似性而不是確切名稱來鍵入?

我有兩個不同的 DataStreams,我正在做一個聯合。 在第一個流中,我想要 KeyBy 的字段名稱是“John Locke”,而在第二個數據流中,字段值是“John L”。

我有一個算法,可以給我一些不同字符串之間的分數。 我的想法是:例如,如果兩個字符串之間的分數高於 0'80,那么這兩個字符串將被視為相同,當我應用 keyby("name") 時,這些相似的字符串將被鍵入,因為它們具有完全相同的同名。

視覺示例:

數據流1-----約翰·洛克、米奇·米克、威爾·威廉姆斯

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

數據流 d3= datastream1.union(datastream2)

d3.keyby 分數/相似之處,而不是確切的名稱。

希望你理解,謝謝!

我認為您的要求將難以有效實施。 原因是以下情況:

  • 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 - 確定性鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM