2016-01-26 59 views
5

我對使用Google雲數據流很陌生。我想獲得兩個PCollections的Cartesian產品。例如,如果我有兩個PCollections (1, 2)("hello", "world"),它們的笛卡爾積是((1, "hello"), (1, "world"), (2, "hello"), (2, "world"))如何獲得兩個PCollections的笛卡爾積

任何想法,我可以做到這一點?此外,由於笛卡爾產品可能很大,我希望解決方案會懶惰地創建產品,從而避免大量的內存消耗。

謝謝!

+0

關於你想要做什麼,你有更多的細節嗎?每個PCollections有多大?有幾種方法可以實現這個目標,哪一個更好取決於你想要的笛卡爾產品的原因和實際的PCollections。 –

+0

這兩個PCollections是相同的。它們都包含大約100,000個類型爲'(String,String)'的元組。我正在使用英語單詞詞典並獲得他們的語音轉錄以便生成2個單詞的雙關語,例如:「fantasti-CAL-ifornia」。 –

+0

對於直接的笛卡爾解決方案,[this](http://stackoverflow.com/a/41051283/377366)似乎是現在可用的最佳答案。 – KobeJohn

回答

3

一般來說,計算笛卡爾產品將是昂貴的。如果其中一個(或兩個)收藏夾適合內存,則可以使用side-inputs將數據廣播給所有工作人員。因此,舉個例子,你可以將PCollection<String>變成一個側面輸入,然後你將有一個ParDo作爲主要輸入。對於主輸入上的每個字符串,您可以訪問所有值都爲Iterable<String>的側輸入,並且您會輸出這些對(或者您可以在此DoFn中選擇僅輸出對齊的對)。

這將重新遍歷整個單詞集 - 每次 - 如果它適合內存這應該沒問題。如果它每次都必須重新獲取側面輸入數據,可能會產生問題。

另一種方法是依靠洗牌和密鑰。假設你想找到3個字母重疊的單詞。您可以處理字典並生成由3個字母前綴鍵入的值的PCollection。您還可以創建類似PCollection的三個字母的後綴。那麼你可以GroupByKey(或CoGroupByKey)。之後,您必須爲每個3個字母的關鍵字,所有以該關鍵字作爲前綴並作爲後綴的關鍵字。

+0

感謝您的輸入!我可能會使用'GroupByKey'方法! –

+3

這實際上並沒有回答如何做笛卡爾產品的問題。 – Max