一次資料分析的全過程

2022-04-08 02:59:01 字數 3519 閱讀 3233

源資料就是個日誌文字資訊

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

要的結果是統計一下,各時段對應的超時毫秒的數量

理論上也不複雜,能找出資料規律,進行分組統計而已,但問題在於:

首先統計是上下文相關的,即通過上下文的資料相計算才能獲取到相應的指標

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

原來想著應該是輕而易舉的事情,先把資料匯入oracle吧

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

先統計了再說吧

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

) awhere a.g='tofront()=true' and a.aa>90 )

order by f,d,b,g

) bgroup 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結果統計出來了,結果非預期的,又對幾條資料進行了統計和明細的對比,發現確實有些小問題,可問題出在**,也說不清楚。

為了解釋清楚這個問題,還是對資料加上行號吧,再次進行對比,發現資料的位置變化了,和原本的日誌順序是不一樣的。

為了解決這個問題,還是用rownum加上表資料生成到另外一張測試表吧,再去看看行號和日誌的順序是否能夠對應,卻發現日誌的插入順序和行號是不一致的!

又問了下同事,業務邏輯到底是怎樣的,答曰:日誌中上下文的順序是很嚴格的

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

又在excel中做了一下測試,excel做測試很容易,先獲取上條記錄的毫秒資訊,再進行排序,再把資料進行篩選,然後再進行分組判斷,最後進行交叉表的生成。

對應大資料量來說,excel的拖拉顯然就滿了很多,其次還需要函式、排序、複製資料,總的來說還是比較耗時的。

還是想想怎麼解決行號問題吧,確保行號就是資料的原始順序,首先加了乙個sequence,後來又在該表中增加了乙個觸發器,然後把資料重新匯入一遍

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;

再去驗證資料的順序,這次才算正常了

資料正常了,業務邏輯就簡單多了,只需要把最核心的部分修改一下,按行號排序即可

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

統計完成後,再拷貝到excel中進行資料透視表轉換,再把**資料拷貝出來,加一些美觀資訊即可。

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

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

再其次,oracle匯入時的資料順序有問題,不過我想也許是我自己還沒找解決問題的根本原因吧。

本文出自 「不勝人生一場醉」 部落格

一次詭異的full gc查詢問題全過程

背景 乙個服務突然所有機器開始頻繁full gc。而服務本身沒有任何改動和發布記錄。上線檢視gc log日誌,日誌如下 從日誌來看,每次發生full gc的時候都比較奇怪,主要有兩點,第一 old區域和perm的區域使用率很低,沒有到達觸發full gc的條件,第 二 專案中配置的是cms,為什麼沒...

記一次資料提取過程

某次需要乙個中文電碼本,然而網上搜到的要麼收費,要麼不行,所以打算自己做乙份,但是看了下資料量實在太大只能放棄,那麼怎麼辦呢。收到乙個軟體teleccodetool 可以查詢漢字對應的電碼,隨即準備提取,過程記錄如下。無關的檔案已經刪除了,只剩三個核心檔案 乙個個看,第乙個配置檔案開啟沒啥有用的訊息...

一次資料變更的審核過程

今天正在做乙個資料變更操作,突然乙個開發的同學找到我,看起來比較著急的樣子,說想讓我做乙個資料變更。當然在這種時候,我正在做的資料變更操作已經被打斷了,已經有一些不願意了,而且還要緊急變更,在沒有得到指令碼,沒有環境,沒有指令碼說明,對於這種三無要求我一向都是比較排斥的。所以我靜下來,讓他提供這些資...