使用阿里雲maxcompute sql隨機從查詢數據中抽取n條樣本

近些年大數據發展迅速,大數據生態圈也越來越豐富。使用sql進行數據分析時有個常用的組件叫 HIVE ,而阿里雲則提供了類似HIVE功能的商業雲服務,稱爲 maxcompute

今天記錄一下使用maxcompute sql從數據中隨機抽取n條樣本的方法。

假設有數據如下:

id name
1 張三
2 李四
3 王五
4 龍傲天
5 劉斬仙
6 趙日天

我們想隨機從上表中抽取3條數據,應該怎麼寫?

假設表名爲tmp_table:

select id,name from tmp_table
order by rand() limit 3

這樣就能夠從表中隨機抽取3條數據了。假設我們運行的結果如下:

1 張三
3 王五
4 龍傲天

你可以嘗試反覆運行上面的sql,然後就會發現,每次運行的結果都是相同的,隨機抽取數據都是上面給的3條。爲什麼呢?

從sql來理解,上面的語句相當於生成了一個隨機序列,每條記錄都分配了一個隨機值,然後所有記錄按照隨機值排序,從排序結果中取前3條,以此達到隨機選擇的目的。

然後rand()方法產生隨機數需要使用隨機數種子,相同隨機數種子產生的隨機數永遠都是一樣的。當不傳遞隨機數種子時,函數將使用默認的固定隨機數種子,所以無論運行多少次,產生的隨機數都是固定的。

那要怎麼解決這個問題呢?傳入每次都會變化的隨機數種子就可以啦。比如選擇當前的時間戳:

select id,name from tmp_table
order by rand(unix_timestamp()) limit 3

現在,每次運行的結果都不一樣咯,搞定!

參考文章:

MaxCompute SQL隨機抽取N行數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章