Algorithm Pig如何以0.0001这样的比率有效地采集1TB数据?

Algorithm Pig如何以0.0001这样的比率有效地采集1TB数据?,algorithm,apache-pig,Algorithm,Apache Pig,pig如何实现示例方法?我是否可以通过只读取一次所有数据来对数据进行采样 编辑: 我发现了一篇关于这个话题的文章。这很有帮助。是的,一次数据就足以用任何定量(让它是r)进行采样,使用: 设k=SIZE*r//SIZE是输入数组的大小 设R为结果数组(大小为k),S为原始(输入)数组 //首先用S的前k个元素填充前k个元素或R 对于从1到k的每个i: R[i]=S[i] //然后,从R中随机选择if和哪个元素替换为新的候选元素 对于从k+1到尺寸的每个i: j=随机(1,i)//1到i之间的均匀分

pig如何实现示例方法?我是否可以通过只读取一次所有数据来对数据进行采样

编辑:
我发现了一篇关于这个话题的文章。这很有帮助。

是的,一次数据就足以用任何定量(让它是
r
)进行采样,使用:

设k=SIZE*r//SIZE是输入数组的大小
设R为结果数组(大小为k),S为原始(输入)数组
//首先用S的前k个元素填充前k个元素或R
对于从1到k的每个i:
R[i]=S[i]
//然后,从R中随机选择if和哪个元素替换为新的候选元素
对于从k+1到尺寸的每个i:
j=随机(1,i)//1到i之间的均匀分布数
//以概率i/k插入新元素,而不是现有元素之一
如果j

最后,每个元素都有被挑选的概率
k/SIZE=r

。但是如何在Hadoop上使用这种方法对1TB数据进行采样呢?@Canoe的一种方法是让每个reducer在第一阶段输出
k
样本,如上所述。这将为您提供
#减速器*k
示例。在第二个map reduce阶段,从
#reducers*k
候选中选择最后的
k
样本。虽然它似乎是两次通过的算法,但回想一下#减缩器和k相对较小-因此第二阶段要快得多。当数据大小和k都较大时,我们无法将数据放入映射器内存,此方法失败。@Canoe 0.0001PB仅为100MB。这在2014年不应该是一个问题,但当比率更大时…我在我添加的链接中找到了一个答案
Let k = SIZE * r //SIZE is the size of input array
Let R be the result array (of size k), and S be the original (input) array
//first populate the first k elements or R with first k elements of S
for each i from 1 to k:
    R[i] = S[i]
//then, choose randomly if and which element from R to replace with the new candidate
for each i from k+1 to SIZE:
   j = random(1,i) //uniformly distributed number between 1 to i
   //insert the new element at probability i/k, instead one of the existing elements
   if j < k:
       R[k] = S[i]
return R