2014-10-20 74 views
2

我在BigQuery中有一个表。我有一个字符串列表示一个唯一的ID(uid)。我只想通过只取得一部分uid(比如说1/100)来过滤这张表的一个样本。 所以我的想法是做这样的事情采样数据:BigQuery - 根据一些哈希标准对数据进行分区

if(ABS(HASH(uid)) % 100 == 0) ... 

的问题是,这将在1/100的比例只有散列值的分布是均匀的实际过滤。因此,为了确认,我想生成如下表:

(n goes from 0 to 99) 

0 <number of rows in which uid % 100 == 0> 
1 <number of rows in which uid % 100 == 1> 
2 <number of rows in which uid % 100 == 2> 
3 <number of rows in which uid % 100 == 3> 

..等

如果我看到每一行的数字是相同的数量级,那么我的假设是正确。

任何想法如何创建这样的查询,或者采取另一种方式做抽样?

回答

4

喜欢的东西

Select ABS(HASH(uid)) % 100 as cluster , count(*) as cnt 
From yourtable 
Group each by cluster 

的UID是不同的情况(上,下)和类型,你可以哈希中使用某些字符串操作。例如:

Select ABS(HASH(upper(string(uid)))) % 100 as cluster , count(*) as cnt 
From yourtable 
Group each by cluster 
3

作为HASH()的替代方法,您可以尝试使用RAND() - 它不依赖于均匀分布的ID。

例如,这将给你10个大致相等大小的分区:

SELECT word, INTEGER(10*RAND()) part 
FROM [publicdata:samples.shakespeare] 

验证:

SELECT part, COUNT(*) FROM (
    SELECT word, INTEGER(10*RAND()) part 
    FROM [publicdata:samples.shakespeare] 
) 
GROUP BY part 
ORDER BY part 

每组用约16465元件结束。

+0

你甚至可以把RAND部分放在WHERE子句中: SELECT * FROM table WHERE RAND()<0.01 – 2014-10-21 06:00:18

+0

RAND对数据的随机部分很有用。但是,如果我寻求一致性(每次查询同一个表时在同一分区中都有相同的记录),它仍然可以工作吗? – 2014-10-21 06:36:08

+0

谢谢大家!然而,作为后续,我发现我将无法使用hash()或rand()。原因是相同的会话ID出现在多种类型中,我需要从所有类型中筛选出一个特定的ID。这意味着我需要一个函数,给定相同的会话ID将产生相同的整数(我将通过执行%100来进行抽样),以便过滤对任何表中的给定ID都是确定性的。 – 2014-10-21 06:56:46