99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀一次數(shù)據(jù)分析的全過程
一次數(shù)據(jù)分析的全過程
2017-01-14
收藏

一次數(shù)據(jù)分析的全過程

剛下完班的時候,在公司無聊的坐著,一位同事拿了一些數(shù)據(jù)給我,說讓我實現(xiàn)一個類似交叉表格的統(tǒng)計報表。


源數(shù)據(jù)就是個日志文本信息

2008/1/11               02:14:33:181           181          00001c68                SeqID       418370    ToBack()=TRUE       Len=154  MsgID=x00000202                 
2008/1/11               02:14:33:181           181          00001c68                SeqID       418370    ToFront()=TRUE      Len=260  MsgID=x08000202                BEIP=192.168.1.162                BEPort=22049
2008/1/11               03:05:42:330           330          00004110                SeqID       418370    ToBack()=TRUE       Len=154  MsgID=x00000202                 
2008/1/11               03:05:42:346           346          00004110                SeqID       418370    ToFront()=TRUE      Len=261  MsgID=x08000202                BEIP=192.168.1.163                BEPort=22049



要的結(jié)果是統(tǒng)計一下,各時段對應(yīng)的超時毫秒的數(shù)量


理論上也不復(fù)雜,能找出數(shù)據(jù)規(guī)律,進行分組統(tǒng)計而已,但問題在于:

首先統(tǒng)計是上下文相關(guān)的,即通過上下文的數(shù)據(jù)相計算才能獲取到相應(yīng)的指標

其次如何判斷上下文的場景,根據(jù)幾組字段判斷都有問題,即得不到唯一的標示

原來想著應(yīng)該是輕而易舉的事情,先把數(shù)據(jù)導入oracle吧

有日期有時間,需要把文本的日期時間處理成oracle的date類型,可偏偏date類型不支持毫秒運算,第一個問題出來了,依賴于日志中已有的毫秒進行上下文計算又有一定的問題。

先統(tǒng)計了再說吧

select b.hours,

case when overlap<10 then '<10ms'

when overlap<20 then '10-20'

when overlap<30 then '20-30'

when overlap<40 then '30-40'

when overlap<50 then '40-50'

when overlap<60 then '50-60'      

when overlap<70 then '60-70'

when overlap<80 then '70-80'

when overlap<90 then '80-90'  

else '>90ms'

end tt,

count(*)

from

(

select a.f,a.d from

(

select k,a,b,f,d,g,c,

LAG(c, 1, 0) OVER (partition by f,d ORDER BY B,g) lastc,

LAG(b, 1, 0) OVER (partition by f,d ORDER BY B,g) lastb,

case when c - LAG(c, 1, 0) OVER (ORDER BY tt)>=0  then c - LAG(c, 1, 0) OVER (ORDER BY tt)

else  c - LAG(c, 1, 0) OVER (ORDER BY tt)+1000 end aa

from test6 t 

) a

where a.g='ToFront()=TRUE' and a.aa>90 )

order by f,d,b,g

) b

group by b.hours,

case when overlap<10 then '<10ms'

when overlap<20 then '10-20'

when overlap<30 then '20-30'

when overlap<40 then '30-40'

when overlap<50 then '40-50'

when overlap<60 then '50-60'      

when overlap<70 then '60-70'

when overlap<80 then '70-80'

when overlap<90 then '80-90'  

else '>90ms'

end


結(jié)果統(tǒng)計出來了,結(jié)果非預(yù)期的,又對幾條數(shù)據(jù)進行了統(tǒng)計和明細的對比,發(fā)現(xiàn)確實有些小問題,可問題出在哪里,也說不清楚。

為了解釋清楚這個問題,還是對數(shù)據(jù)加上行號吧,再次進行對比,發(fā)現(xiàn)數(shù)據(jù)的位置變化了,和原本的日志順序是不一樣的。


為了解決這個問題,還是用rownum加上表數(shù)據(jù)生成到另外一張測試表吧,再去看看行號和日志的順序是否能夠?qū)?yīng),卻發(fā)現(xiàn)日志的插入順序和行號是不一致的!


又問了下同事,業(yè)務(wù)邏輯到底是怎樣的,答曰:日志中上下文的順序是很嚴格的


看來需要徹底解決行號問題了。

又在Excel中做了一下測試,Excel做測試很容易,先獲取上條記錄的毫秒信息,再進行排序,再把數(shù)據(jù)進行篩選,然后再進行分組判斷,最后進行交叉表的生成。

對應(yīng)大數(shù)據(jù)量來說,Excel的拖拉顯然就滿了很多,其次還需要函數(shù)、排序、復(fù)制數(shù)據(jù),總的來說還是比較耗時的。


還是想想怎么解決行號問題吧,確保行號就是數(shù)據(jù)的原始順序,首先加了一個sequence,后來又在該表中增加了一個觸發(fā)器,然后把數(shù)據(jù)重新導入一遍

create or replace trigger trigger_test6

before insert on test6 

for each row

declare

begin

select tt.nextval into :new.tt from dual;

end trigger_test6;


再去驗證數(shù)據(jù)的順序,這次才算正常了

數(shù)據(jù)正常了,業(yè)務(wù)邏輯就簡單多了,只需要把最內(nèi)核的部分修改一下,按行號排序即可

select rr,k,a,b,f,d,g,c,

LAG(c, 1, 0) OVER (ORDER BY tt) lastc,

LAG(b, 1, 0) OVER (ORDER BY tt) lastb     

from test6 t 


統(tǒng)計完成后,再拷貝到Excel中進行數(shù)據(jù)透視表轉(zhuǎn)換,再把表格數(shù)據(jù)拷貝出來,加一些美觀信息即可。


該件事情還是沒有得到完美解決

主要是毫秒的處理,理論上是時間的直接相減即可,可由于Oracle的date類型無法直接處理,只能采用日志中的毫秒字段進行相減了,碰到相減為負的,則再加回來1000,多少有些問題。

再其次, oracle導入時的數(shù)據(jù)順序有問題,不過我想也許是我自己還沒找解決問題的根本原因吧。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }