我在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>
..等等。
如果我看到每行中的数字具有相同的幅度,那么我的假设是正确的。
知道如何创建这样的查询,或者以另一种方式进行采样吗?
答案 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个元素。