Hash BigQuery—根据某些哈希标准对数据进行分区
我在BigQuery中有一个表。我有一个表示唯一id(uid)的字符串列。我只想通过只获取一部分UID(比如1/100)来筛选这个表的一个样本。 因此,我的想法是通过如下方式对数据进行采样: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
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现在是一个保留关键字-我现在修复了查询!