BigQuery - 根据一些哈希标准对数据进行分区

时间:2014-10-20 17:20:56

标签: hash google-bigquery

我在BigQuery中有一个表。我有一个字符串列,表示一个唯一的ID(uid)。我只想过滤这个表的一个样本,只取一部分uid(让我们说1/100)。 所以我的想法是通过这样的方式对数据进行采样:

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>

..等等。

如果我看到每行中的数字具有相同的幅度,那么我的假设是正确的。

知道如何创建这样的查询,或者以另一种方式进行采样吗?

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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个元素。