hive 抽樣查詢 有時間再研究研究

2021-10-09 19:35:05 字數 1541 閱讀 7929

對於非常大的資料集,有時使用者需要使用的是乙個具有代表性的查詢結果而不是全部結果。hive可以通過對錶進行抽樣來滿足這個需求。 就是隨機查詢

抽樣查詢

是查詢語句,只不過寫的時候有指定的格式. 就是按照規則查詢指定的桶的資料

select

*from test_bucket_sorted tablesample (bucket 1

outof

2on id)

;

首先 test_bucket_sorted 必須是乙個分桶表****

tablesample 是關鍵字,後面跟 bucket x out of y on 分桶表的字段,如果是根據id分桶,那麼就寫id, 不能寫其他非分桶字段

bucket x out of y on 分桶表分桶字段

假設當前表一共分了z個桶

x是 從當前表的第幾桶開始抽樣

0那麼怎麼抽呢?從第x桶開始抽,每間隔y桶抽一桶,直到抽滿z/y桶.

假設下面sql是 4桶

select *

from test_bucket_sorted tablesample (bucket 1 out of 2 on id);

這樣寫的意思就是從0號桶開始抽,每間隔兩桶抽一桶,乙個抽2桶: 結果就是0號桶加2號桶 (1和3)

抽第幾桶可以這麼理解x+y*(n-1)桶

要求y必須是z的因子或倍數! 這是官方要求,意思是 z除以y必須能被整除,不能有小數點.

格式:select * from 分桶表 tablesample(bucket x out of y on 分桶表分桶字段);

tablesample 是關鍵字

x 和y 都是數字, on後面有分桶字段. 根據id分桶的話,只能寫id欄位.

假如說總共有4桶

怎麼抽: 從第x桶開始抽樣,每間隔y桶抽一桶,直到抽滿 z/y桶

bucket 1 out of 2 on id:

這就是相當於抽第一桶和第三桶(0號和2號桶)

從第1桶(0號桶)開始抽,抽第x+y*(n-1),一共抽2桶(這個數字是最大桶除以y算出來的) : 0號桶,2號桶

bucket 2 out of 1 on id:

這樣是不行的,因為x需要大於0並且小於y . 而2大於1了,所以就不行

bucket 1 out of 1 on id

x等於y了 ,相當於 從第1桶(0號桶)開始抽,抽第x+y*(n-1), 也就是 4桶

也相當於查詢全部了

一共抽4桶 : 0號桶,2號桶,1號桶,3號桶

bucket 2 out of 4 on id

從第2桶(1號桶)開始抽 , ,抽第x+y*(n-1) , 一共抽1桶 : 1號桶

bucket 2 out of 8 on id

從第2桶(1號桶)開始抽,一共抽0.5桶 : 1號桶的一半

有時間再研究吧

includeusing namespace std struct pt struct cmp int main all.push back temp vec.push back 0 vectorsort priority queue,cmp qu 優先佇列 for int i 0 i 1 if g...

有時間再解決的問題 已解決

據說是錯的,有時間再看為什麼 需要動態申請的啊,堆疊上面的陣列是不能直接返回的會在函式退出的時候銷毀掉 includeint returnnum return a error cannot convert int 5 to int in return int main printf n free c...

bochs還是挺好用的,有時間研究研究

無意中連到純c論壇,此處的os試驗很火,還有若干個正在開發中的試驗性os.論壇上各個充滿了學習的熱情,彷彿一夜之間,全民都寫作業系統了.google了一下,才發現網上開源的os專案多如牛毛.不過我覺得,要學習os,看看linux早期核心的源 足以掌握大方向.作業系統是什麼,比較特殊的軟體而已.寫os...