成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hive進階—抽樣的各種玩法

大數據
我們一般情況下是使用排序函數和rand() 函數來完成隨機抽樣,limit關鍵字限制抽樣返回的數據,不同之處再有我們使用哪個排序函數呢?

[[375757]]

本文轉載自微信公眾號「Java大數據與數據倉庫」,作者劉不二。轉載本文請聯系Java大數據與數據倉庫公眾號。  

抽樣

抽樣在Hive 中也是比較常用的一種手段,主要用在下面的幾個場景中

  1. 一些機器學習的場景中,數倉作為數據的提供方提供樣本數據
  2. 數據的計算結果異常或者是指標異常,這個時候如果我們往往需要確認數據源的數據是否本身就有異常
  3. SQL的性能有問題的時候我們也會使用抽樣的方法區查看數據,然后進行SQL調優
  4. 在大規模數據量的數據分析及建模任務中,往往針對全量數據進行挖掘分析時會十分耗時和占用集群資源,因此一般情況下只需要抽取一小部分數據進行分析及建模操作。

隨機抽樣(rand()函數)

我們一般情況下是使用排序函數和rand() 函數來完成隨機抽樣,limit關鍵字限制抽樣返回的數據,不同之處再有我們使用哪個排序函數呢

利用 rand() 函數進行抽取,這是因為rand() 返回一個0到1之間double 類型的隨機值。

下面我們用到了前面我們使用過的一張表大概4603089 條記錄,這里我就不給大家準備數據了,大家可以看Hive進階之數據存儲格式來獲取測試數據

  1. create table ods_user_bucket_log( 
  2.      id int
  3.      name string, 
  4.      city string, 
  5.      phone string, 
  6.      acctime string) 
  7. CLUSTERED BY (`id` ) INTO 5 BUCKETS  
  8. row format delimited fields terminated by '\t' 
  9. stored as textfile; 
  10. insert overwrite table ods_user_bucket_log select * from ods_user_log; 

order by rand()

order by只會啟用一個reduce所以比較耗時,至于為什么我們在前面的文章中解釋過了Hive語法之常見排序方式

因為order by 是全局的,所以可以做到隨機抽樣的目的

  1. select * from ods_user_bucket_log order by rand() limit 10; 

sort by rand()

sort by 提供了單個 reducer 內的排序功能,但不保證整體有序,這個時候其實不能做到真正的隨機的,因為此時的隨機是針對分區去的,所以如果我們可以通過控制進入每個分區的數據也是隨機的話,那我們就可以做到隨機了

  1. select * from ods_user_bucket_log sort by rand() limit 10; 

distribute by rand() sort by rand()

rand函數前的distribute和sort關鍵字可以保證數據在mapper和reducer階段是隨機分布的,這個時候我們也能做到真正的隨機,前面我們也介紹過cluster by 其實基本上是和distribute by sort by 等價的

  1. select * from ods_user_bucket_log distribute by rand() sort by rand() limit 10; 

cluster by rand()

cluster by 的功能是 distribute by 和 sort by 的功能相結合,distribute by rand() sort by rand() 進行了兩次隨機,cluster by rand() 僅一次隨機,所以速度上會比上一種方法快

  1. select * from ods_user_bucket_log cluster by rand() limit 10; 

tablesample()抽樣函數

分桶抽樣(桶表抽樣)

hive中分桶其實就是根據某一個字段Hash取模,放入指定數據的桶中,比如將表table按照ID分成100個桶,其算法是hash(id) % 100,這樣,hash(id) % 100 = 0的數據被放到第一個桶中,hash(id) % 100 = 1的記錄被放到第二個桶中。

分桶抽樣語法:

TABLESAMPLE (BUCKET x OUT OF y [ON colname])

其中x是要抽樣的桶編號,桶編號從1開始,colname表示抽樣的列(也就是按照那個字段分桶),y表示桶的數量。所以表達的意思是按照colname字段分成y桶,抽取其中的第x桶

  1. SELECT 
  2.     * 
  3. FROM 
  4.     ods_user_bucket_log 
  5. TABLESAMPLE (BUCKET 1 OUT OF 100000 ON rand()) ; 

數據塊抽樣

從 Hive 0.8 開始提供塊抽樣,使用 tablesample 抽取指定的 行數/比例/大小

  1. SELECT * FROM ods_user_data TABLESAMPLE(1000 ROWS); 
  2. SELECT * FROM ods_user_data TABLESAMPLE (20 PERCENT);  
  3. SELECT * FROM ods_user_data TABLESAMPLE(1M);  

按比例抽樣 ABLESAMPLE (20 PERCENT)

這將允許 Hive 至少獲取 n%的數據

  1. SELECT 
  2.     * 
  3. FROM 
  4.     ods_user_bucket_log 
  5. TABLESAMPLE(0.0001 PERCENT); 

抽取特定大小的數據TABLESAMPLE(100M)

  1. SELECT 
  2.     * 
  3. FROM 
  4.     ods_user_bucket_log 
  5. TABLESAMPLE(1M); 

需要注意的是這里必須是整數M ,以為我嘗試零點幾的時候報錯了

抽取特定的行數 TABLESAMPLE(10 ROWS)

  1. SELECT 
  2.     * 
  3. FROM 
  4.     ods_user_bucket_log 
  5. TABLESAMPLE(10 rows); 

擴展

隨機抽樣如何實現按比例抽樣

前面我們介紹了TABLESAMPLE 可以實現按比例抽樣,隨機抽樣可以借助limit 可以實現抽取特定記錄數,其實我們如果對隨機抽樣進行改進也可以實現按照比例抽樣,因為rand() 的函數值是隨機的,所以我們可以對其返回值做條件過濾從而實現按照比例的抽樣

  1. select 
  2.     * 
  3. from
  4.     select 
  5.         * ,rand() as radix 
  6.     from 
  7.         ods_user_bucket_log 
  8. ) tmp 
  9. where 
  10.     radix>=0.0 
  11.     and radix<=0.0001 

分層抽樣(分組抽樣)

分層抽樣,這里可以分為兩種,一種是分層抽個數另外一種是分層抽比例

分層抽個數

  1. select 
  2.     * 
  3. from ( 
  4.     select 
  5.         id,ctime, 
  6.         row_number() over(partition by id order by rand() ) as rn 
  7.     from 
  8.         ods_user_log 
  9. ) tmp 
  10. where rn<=3 

分層按比例的抽樣,也可以按照上面的方式實現

總結

  1. TABLESAMPLE 抽樣函數本身是不走MR 的所以執行速度很快(注意抽取多少M的時候,只能是整數M)
  2. 隨機抽樣函數需要走MR的,所以執行性能上沒有TABLESAMPLE那么快,而且表達能力有限,只能獲取特定的條數(limit n)
  3. 借助row_number實現分層抽樣

 

 

責任編輯:武曉燕 來源: Java大數據與數據倉庫
相關推薦

2022-11-02 11:40:16

Flowable定時器流程

2015-07-15 17:09:48

HiveHadoop分布式文件系統

2022-11-15 16:37:38

PyTorch抽樣函數子集

2015-09-24 17:41:15

Windows 10

2013-08-26 10:11:08

Intel固態硬盤超頻

2015-08-25 10:56:21

大數據

2024-06-28 09:52:47

列表Python

2022-05-30 16:57:44

TypeScriptTS前端

2019-05-15 15:40:18

朋友圏微信評論

2022-02-22 11:50:16

Python字典代碼

2022-05-11 10:41:25

kaptcha工具驗證碼

2022-12-09 08:19:43

HTTP協議MIME

2013-07-10 11:32:57

編碼風格

2024-03-29 13:25:12

互動玩法直播

2012-04-11 13:32:48

JavaSoapUI

2022-09-06 08:25:18

FedoraLinux

2024-11-21 10:07:40

2024-12-02 13:28:44

2021-12-31 15:05:12

鴻蒙HarmonyOS應用

2023-09-11 08:20:17

對象閉包底層
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美中文一区 | 午夜看看 | 老司机成人在线 | 国产在线精品一区二区三区 | 久久国产精品无码网站 | 欧美精品一区二区三 | 国产精品日韩 | 美女福利网站 | 日本黄色的视频 | 亚洲天堂中文字幕 | 成人日韩av | 成人激情视频 | av网站免费在线观看 | 日韩不卡在线 | 激情网站在线 | 久久久久久久一区 | 欧美三级三级三级爽爽爽 | 日韩在线观看一区 | 又黄又爽的网站 | 国产一区影院 | 久久久久久亚洲精品 | 影音先锋男 | 欧美色综合 | 国产91一区二区三区 | 成年人网站免费 | 台湾佬久久 | 国产一区二区三区日韩 | 免费视频99 | 国产成人高清视频 | 亚洲国产69 | av手机免费在线观看 | 日本在线视频中文字幕 | 国产高清视频在线观看 | 999热精品视频 | 秋霞a级毛片在线看 | 国产三级电影网站 | 亚洲精品视频一区 | 91av在线免费播放 | 国产美女一区二区三区 | 成人免费在线播放视频 | 蜜桃一区二区三区 |