2016-06-07 160 views
0

我想使用數據流採樣靜態數據源。我知道有一個Sample轉換,它允許您對固定數量的數據元組進行採樣,但在我的用例中有所不同的是,根據實際的源大小,我的目標採樣數是動態的。使用動態採樣計數對採樣進行採樣

我知道有一種方法是,我可以首先計算我的數據源,計算我的抽樣概率,並使用ParDo過濾我的pcollection,在每個DoFn內翻轉硬幣。

然而,一個缺點是尤其是當我的概率非常低(例如,如果我想從500M +池中挑選50個樣本隨機),它似乎不是很穩定。

所以我只是想知道,有沒有更好的辦法呢? (不知怎的,我認爲這只是一些數據流的黑客,我不知道)


編輯:

遺憾的混亂。問題是我不知道預先來源的大小,他們可能範圍從1M到500M,並根據我的實際大小,我想以不同的方式對它進行抽樣,例如我的樣本大小是min(actual_size,2.5e10 /( actual_size)),這使得當我的源碼大小恰好爲500M時,我只想要其中的50個。當我的實際大小爲5M,我想品嚐5000

我特別想知道: 是否有任何內置PTranform,我可以用這個特定使用案例(比如我可以用Sample只是一些解決方法嗎?)

+0

你可以分享更多關於你希望樣本大小與輸入大小相關的細節嗎?從你的例子來看,你似乎可以選擇一個50/500M的概率,而且應該做你想要的。 –

回答

1

我不認爲有一個內置的變換處理這個。問題是,隨着你的收藏變大,你描述的功能實際上想要產生一個更小的樣本。

似乎有有幾種方法可以用來嘗試解決這個問題:

  1. 編寫自定義CombineFn一個使用List由於儲液器,並建立了採樣元素的列表。這種方法的問題是,在最壞的情況下,你需要有一個158113元素的列表,它需要適應內存 - 這可能是不可取的。

  2. 使用Count變換來計算出有多少元素,並將其用作執行過濾的DoFn的側輸入。 DoFn可以讀取側面輸入以找出總輸入大小,然後基於此進行概率抽樣。