Hash BigQuery—根据某些哈希标准对数据进行分区

Hash BigQuery—根据某些哈希标准对数据进行分区,hash,google-bigquery,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 % 10

我在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>
(n从0到99)
0
1.
2.
3.
。。等等

如果我看到每一行中的数字大小相同,那么我的假设是正确的

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

类似于

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 
作为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个元素。

您甚至可以将RAND部分放在WHERE子句中:SELECT*FROM table,其中RAND()<0.01RAND对于数据的随机部分非常有用。但是如果我寻找一致性(每次查询同一个表时,在同一个分区中都有相同的记录),它还能工作吗?谢谢大家!然而,作为后续工作,我发现我将无法使用hash()或rand()。原因是相同的会话id出现在多个类型中,我需要从所有类型中筛选某个id。这意味着我需要一个给定相同会话id的函数,该函数将生成相同的整数(我将通过执行%100进行采样),以便对任何表中的给定id进行确定性筛选。@FelipeHoffa我尝试了第一个查询,得到了
错误:在第1行第35列遇到了“PARTITION”“PARTITION”。我们期望:
PARTITION现在是一个保留关键字-我现在修复了查询!