MySQLへのログのインポート

ログファイルを一行ずつ読み込んで処理する方式だとちょっとメモリを食いすぎるということで
一旦DBに突っ込んでからログを集計したいなということになる。


そういう時にはLOAD DATA INFILEが使えるようだ。
DBとテーブルとフィールドをあらかじめ定義しておけば下のような形で一気に読み込んでくれるようだ。

LOAD DATA INFILE 'apache_log.txt' INTO TABLE apachelog
FIELDS TERMINATED BY ' '
LINES TERMINATED BY '\n';


そうするとこのやり方でホスト名ごとのランキングを出したい場合は下記のような感じ?

require 'mysql2'
require 'resolv'

client = Mysql2::Client.new(:host => "localhost", :username => "root", :password => "********", :database => "apachelog")

ipCount = Hash::new
client.query("SELECT ip, count(1) FROM apachelog group by ip").each do |ip|
  ipCount[ip['ip']] = ip['count(1)']
end

namesCount = Hash::new
ipCount.each{|key, val|
   if(namesCount[Resolv.getnames(key)] == nil)
     namesCount[Resolv.getnames(key)] = val.to_i
   else
     namesCount[Resolv.getnames(key)] + val.to_i
   end
}

puts namesCount.sort_by{|key,val| -val}