2014-10-20 41 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

相關問題