2009-12-13 70 views
0

我一直在尋找使用MapReduce來構建一個並行記錄組合系統。語言並不重要,我可以使用Hadoop之類的預先存在的庫,或者在必要時構建我自己的庫,我並不擔心這一點。並行記錄組合 - 在多個鍵上匹配

然而,我一直在遇到的問題是,我需要在多個條件上匹配記錄。例如:我可能需要匹配基於人名該人的電話號碼的記錄,但不一定是該人的姓名電話號碼。

例如,假設每條記錄的下列鍵:

  1. '約翰·史密斯' 和 '555-555-5555'
  2. '簡·史密斯' 和 '555-555-5555'
  3. 「約翰·史密斯」和「555-555-1111」

我希望系統採取一切三個記錄,弄清楚它們匹配的關鍵之一,並結合成一個具有單個結合紀錄這兩個名字('John Smith'和'Jane Smith')也是如此作爲兩個電話號碼('555-555-5555'和'555-555-1111')。

這是我可以使用MapReduce完成的事情嗎?如果是這樣,我將如何去匹配由Map函數生成的鍵,以便所有匹配的記錄都可以傳遞到Reduce函數中。*或者,我可以做的更好嗎?我唯一真正的需求是我需要並行化。

[*]請注意:我假定可以使用Reduce函數,使得每次調用Reduce函數都會生成一個單獨的組合記錄,而不是Reduce函數,從而爲整個作業生成一個單獨的結果。

回答

0

我不認爲Map在這裏很有用,因爲您無法真正爲每條記錄創建有意義的鍵,這有助於識別記錄分組。

使用Reduce也無法實現此功能。考慮一下你自己給出的例子......如果你查詢'Jane Smith',那麼你在第一條記錄與查詢相關時就無法檢測到,所以會忽略它。事實上,你可能會將名字和數字鏈接在一起,直到你獲得了文件中的每條記錄。獲取所有匹配的唯一方法是迭代掃描列表,直到您停止找到新的鏈接。

雖然這很容易並行化,但您可以在一些線程之間共享記錄,並且每個線程都可以搜索自己的記錄以獲取新鏈接。我建議將這些集合視爲數據環,以便您可以記錄您正在搜索的最新信息,並且一旦所有線程完成了一個完整的循環,就會完成。

1

你絕對可以在地圖/縮小范例中做到這一點。

假設您匹配任何包含「smith」或以「555」開頭的電話號碼。例如,您會將搜索字符串標準化爲「smith |^555」。在地圖階段,你會怎麼做:

  • 約翰·史密斯/ 555-555-5555 K:史密斯|^555,V =(約翰·史密斯,555-555-5555)
  • 李四/ 555-555-5555 K:史密斯|^555,V =(Jane Doe的,555-555-5555)
  • 約翰·史密斯/ 555-555-1111 K:史密斯|^555,V =(John Smith,555-555-1111)

既然你已經給了他們所有相同的密鑰(「smith |^555」),它們將全部交給同一個reducer實例,它現在可以得到:

K:smith |^555, V:[(John Smith,555-555-5555),(Jane Smith,555-555-5555),(John Smith,555-555-1111))

現在,在你的reducer步驟中,你可以實例化一個用於名稱的哈希集和另一個用於數字的哈希集,然後在完成處理值數組後,輸出名稱哈希集中的所有鍵和數字哈希集中的所有鍵。