2016-06-07 135 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可以读取侧面输入以找出总输入大小,然后基于此进行概率抽样。