[MUSASHI-users 464] Re: アクセスログの複数条件による集計

Back to archive index

Sumio Ebisawa ebisa****@aa*****
2005年 1月 3日 (月) 03:41:14 JST


海老澤です。お世話になります。


石倉様、シェルスクリプトありがとうございます。いただいたアドバイスを
元に、私なりにまとめた結果が下記の通りです。

前提:
・ログファイルは予め参照元と日付を削除し、IDとURLで集計しておく
 前: 001 /a.html 2月1日 www.yahoo.co.jp (フィールド名はID/URL/日付/参照
元)
 後: 001 /a.html 1 (フィールド名はID/URL/PV)
・処理ファイル名は「uniq.xt.gz」、結果は「result_all.xt.gz」とする
・途中処理は全て「tmp」以下で行う。将来的には、このディレクトリを
 RAMディスクにすることで、更なる処理能力向上が期待できる。
 (排他制限の課題は残っていますが)

感想:
・検証用サーバはCeleron600MHzの古いマシンですが、musashiが
 非常に高速で動作することに驚きました。特にコマンドを複数掛け
 合わせたときはUnixコマンドの約7倍以上の処理能力を発揮します。

その他:
・XMLヘッダ内のフィールド名を変えるコマンドが見つからなかったので
 一部Unixコマンドを使用しました。

スクリプト(等幅フォントでご覧願います)
--
#!/bin/sh

####################################################
### 下準備
####################################################

rm -fr tmp/*

####################################################
### 処理開始
####################################################

### ID有りとID無しに分ける
xtselstr -f ID -v "empty" -u tmp/nId.xt -r -i uniq.xt.gz -o tmp/wId.xt -T
tmp

####################################################
### ID有りの処理開始
####################################################

### 全体のページビュー数とユニークユーザ数を算出

#ID有りのページビュー数(全て)を求める
xtcut     -f PV -i tmp/wId.xt                     |
xtsetchr  -v all -a URL                           |
xtagg     -k URL -f PV -c sum -o tmp/wId_all_pv.xt -T tmp

#ID有りのユニークユーザ数(全て)を求める
xtcut     -f ID -i tmp/wId.xt                     |
xtsetchr  -v all -a URL                           |
xtcount   -k URL -a UU -T tmp                     |
xtcut     -f URL,UU -o tmp/wId_all_uu.xt

#一つのXMLテーブルにまとめる
xtjoin -k URL -m tmp/wId_all_pv.xt -f PV -nN -i tmp/wId_all_uu.xt -o
tmp/wId_all_all.xt -T tmp

### URL別のページビュー数とユニークユーザ数を算出

#ID有りのページビュー数(URL別)を求める
xtcut     -f URL,PV -i tmp/wId.xt                 |
xtagg     -k URL -f PV -c sum -o tmp/wId_url_pv.xt -T tmp

#ID有りのユニークユーザ数(URL別)を求める
xtcut     -f URL -i tmp/wId.xt                    |
xtcount   -k URL -a UU -o tmp/wId_url_uu.xt -T tmp

#一つのXMLテーブルにまとめる
xtjoin -k URL -m tmp/wId_url_pv.xt -f PV -nN -i tmp/wId_url_uu.xt -o
tmp/wId_url_all.xt -T tmp

### 全体とURL別の2つのXMLテーブルをマージする
xtcat     -n -i 'tmp/wId_*_all.xt' -o tmp/result_wId.xt

####################################################
### ID無しの処理開始
####################################################

### 全体のページビュー数を算出

### ID無しのページビュー数(全て)をまとめる
xtcut     -f PV -i tmp/nId.xt                     |
xtsetchr  -v all -a URL                           |
xtagg     -k URL -f PV -c sum -o tmp/nId_all_pv.xt -T tmp

### URL別のページビュー数とを算出

#ID有りのページビュー数(URL別)を求める
xtcut     -f URL,PV -i tmp/nId.xt                 |
xtagg     -k URL -f PV -c sum -o tmp/nId_url_pv.xt -T tmp

### 全体とURL別の2つのXMLテーブルをマージする
xtcat     -n -i 'tmp/nId_*.xt' -o tmp/result_nId.xt

####################################################
### 全てを結合する
####################################################

### NoIDのフィールド名「PV」を「PV_noID」に変更
sed s/PV/PV_nID/ tmp/result_nId.xt > tmp/result_nId_tmp.xt
rm -f tmp/result_nId.xt
mv tmp/result_nId_tmp.xt tmp/result_nId.xt

### ID有りとID無しを連結する
xtjoin    -nN -k URL -m tmp/result_nId.xt -f PV_nID -i tmp/result_wId.xt -T
tmp |
xtnulto  -f UU,PV,PV_nID -v 0                       |
xtcal    -c'round($PV_nID*($UU/$PV),1)' -a UU_nID   |
xtcal    -c'($PV+$PV_nID)' -a PV_final -T tmp       |
xtcal    -c'($UU+$UU_nID)' -a UU_final -T tmp       |
xtcut    -f URL,PV_final,UU_final                   |
xtnulto  -f PV_final,UU_final -v 0                  |
xtsort   -k PV_final%nr,UU_final%nr -o result_all.xt.gz -T tmp

####################################################
### 後片付け
####################################################

rm -fr tmp/*











MUSASHI-users メーリングリストの案内
Back to archive index