1. 程式人生 > >hive語句優化-通過groupby實現distinct

hive語句優化-通過groupby實現distinct

同事寫了個hive的sql語句,執行效率特別慢,跑了一個多小時程式只是map完了,reduce進行到20%。
該Hive語句如下:
select count(distinct ip) 
from(select ip as ip from comprehensive.f_client_boot_daily where year="2013" and month="10"  
union all 
select pub_ip as ip from f_app_boot_daily where year="2013" and month="10" 
union all select ip as ip from format_log.format_pv1 where year="2013" and month="10" and url_first_id=1 
) d 

       分析:select ip as ip from comprehensive.f_client_boot_daily where year="2013" and month="10"這個語句篩選出來的資料約有10億條,select pub_ip as ip from f_app_boot_daily where year="2013" and month="10"約有10億條條,select ip as ip from format_log.format_pv1 where year="2013" and month="10" and url_first_id=1 篩選出來的資料約有10億條,總的資料量大約30億條。這麼大的資料量,使用disticnt函式,所有的資料只會shuffle到一個reducer上,導致reducer資料傾斜嚴重。
解決辦法:
首先,通過使用groupby,按照ip進行分組。改寫後的sql語句如下:
select count(*) 
from 
(select ip 
from(select ip as ip from comprehensive.f_client_boot_daily where year="2013" and month="10" 
union all 
select pub_ip as ip from f_app_boot_daily where year="2013" and month="10" 
union all select ip as ip from format_log.format_pv1 where year="2013" and month="10" and url_first_id=1
) d 
group by ip ) b 
然後,合理的設定reducer數量,將資料分散到多臺機器上。set mapred.reduce.tasks=50; 
       經過優化後,速度提高非常明顯。整個作業跑完大約只需要20多分鐘的時間。

相關推薦

hive語句優化-通過groupby實現distinct

同事寫了個hive的sql語句,執行效率特別慢,跑了一個多小時程式只是map完了,reduce進行到20%。 該Hive語句如下: select count(distinct ip) from(sel

[效能優化]通過Shell實現將程序負載均衡到CPU多核

有時候,由於架構設計或其他業務本身特點原因,導致有些應用使用CPU很不均衡,所以業務處理集中在一個CPU上,而其它CPU閒得在睡覺。這裡有個簡單的優化方案實現將各個執行緒繫結到到多個CPU,從而實現效能的提高。 雖然CPU是一個不錯的思路,但是不是殺手鐗,其效能能提高多少依賴於各個執行緒的效能分佈是

hive------ Group by、join、distinct實現原理

map etc 條件 val log in use ins none 操作 1. Hive 的 distribute by Order by 能夠預期產生完全排序的結果,但是它是通過只用一個reduce來做到這點的。所以對於大規模的數據集它的效率非常低。在很多

hive語句實現列轉行

建表語句 CREATE TABLE XXXX表( evel_id string DEFAULT NULL COMMENT 'xxxxid', object_id string DEFAULT NULL COMMENT '所屬物件', obje

Hive SQL優化之 Count Distinct

Hive是Hadoop的子專案,它提供了對資料的結構化管理和類SQL語言的查詢功能。SQL的互動方式極大程度地降低了Hadoop生態環境中資料處理的門檻,使用者不需要編寫程式,通過SQL語句就可以對資料進行分析和處理。目前很多計算需求都可以由Hive來完成,極大程度地降低

hive 底層模組實現-distinct

準備資料 語句 SELECT COUNT, COUNT(DISTINCT uid) FROM logs GROUP BY COUNT; hive> SELECT * FROM logs; OK a 蘋果 3 a 橙子 3 a 燒雞

Java通過 Socket 實現 TCP服務端(一個實例)

trac write 建立 回復 狀態 else 應用程序 字符 system 1 Java Socket簡介   所謂socket 通常也稱作”套接字“,用於描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過”套接字”向網絡發出請求或者應答網絡請求。Socket和S

C#通過Redis實現分布式鎖

rom img com 分布式鎖 ase 即使 lock sta ons Redis有三個最基本屬性來保證分布式鎖的有效實現: 安全性: 互斥,在任何時候,只有一個客戶端能持有鎖。 活躍性A:沒有死鎖,即使客戶端在持有鎖的時候崩潰,最後也會有其他客戶端能獲得鎖,超時機制。

多線程——通過Callable實現(30)

class itl span sta cnblogs over 主體 run 另一個 視頻:https://edu.aliyun.com/course/36/learn?spm=5176.8764728.0.0.fVZ5cb#lesson/433 1.從JDK1.5開始,追

通過python實現TCP編程

練習 python 開始 while cal enc 如果 style logs 偽代碼:ss = socket() #創建服務器套接字ss.bind() #把地址綁定到套接字上ss.listen()

開發技巧-Java通過HttpProxy實現穿越

efault collected ddr apach pac 建立 create set 設置 需求描寫敘述 在正常的項目開發需求中。連接遠程server的場景一般有二: 1 自家實現的httpserver,api接口都已經約定好。

提高系統性能——對SQL語句優化的思考

http art pos select 語句 聯合 data 過程 情況 軟件在研發的過程中自始至終都在留意著系統的可擴展性。但與此同一時候也在關註著系統的性能,SQL語句作為系統性能的一環不容忽視。從今天開始結合開發的經驗,談一下我對SQL語句優化的理

python_如何通過twisted實現數據庫異步插入?

ngs and log handle python ins mysql dba 打印 如何通過twisted實現數據庫異步插入?   1. 導入adbapi   2. 生成數據庫連接池   3. 執行數據數據庫插入操作   4. 打印錯誤信息,並排錯 #!/usr/bin

通過rinetd實現port轉發來訪問內網的服務

data- adding local rac pad 進程 track 5.1 grep 一、 問題描寫敘述 通過外網來訪問內網的服務二、 環境要求 須要有一臺能夠外網訪問的機器做port映射。通過數據包轉發來實現外部訪問阿裏雲的內網服務三、 操作方

Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連接查詢Left Join

exists join ngs sdn 連接查詢 blog 建議 開發 word 在實際開發中,我們往往需要比較兩個或多個表數據的差別,比較那些數據相同那些數據不相同,這時我們有一下三種方法可以使用:1. IN或NOT IN,2. EXIST或NOTEXIST,

APP性能測試診斷與優化--通過現象猜本質

app性能測試診斷與優化--通過現象猜本質 APP性能測試診斷與優化--通過現象猜本質 這段時間忙著幫北京某城商行做移動端性能測試,因移動端IPD、手機等都是無線設備,而且該客戶是面臨全國各地用戶提供移動端APP支持,為了更真實的模擬測試,我跟該項目的項目經理溝通直接在廈門本地通過無線網借用

SQL語句優化

函數 提高 我們 查詢 str ont ransac pro sys 1、在查詢中不要使用“select *” 檢索不必要的列會帶來額外的系統開銷,有句話叫做“該省的則省”; 2、在select清單中避免不必要的列,在連接條件中避免不必要的表; 3、不要在子查詢中使用co

dijkstra算法---通過實現松弛

素材 i++ amp 技術分享 數組 一個 strong 選擇 ima 圖片素材借鑒啊哈磊的博客 該算法用於解決一個點到其余各頂點的最短路徑 先來一張圖,求1點到6點的最短路徑 這讓我想起了差點掛科的運籌學 先用一個二維數組 還有一個一維數組存儲1點到各

自己搭建自動化巡檢系統(三) 通過telnet實現遠程創建loopback

telnet loopback 我們在上一章完成了用代碼操作telnet,實現了遠程控制,分析前面的代碼會發現健壯性太低,需要進行優化,後續會通過開發一個交互式界面來完成人工介入操作網絡的過程。本次實驗目的:實現自動化創建環回口首先更新拓撲,拉出新的路由器和一臺交換機import telnetlibi

通過hash實現前端路由

pro ide location display htm 構造函數 獲取 init listen router.js //構造函數 function Router() { this.routes = {}; this.currentUrl = ‘‘; }