毕业设计二:日志导入
数据源为广西大学网站日志。单个文件100M,大约有100万条记录。为了保证能得到一定数量的会话,所以导入四个文件,总共大约400M,包含有400万条记录。
由于日志格式和原来测试的有些不同,再加上数据量比较大,所以这次处理比较复杂。
日志格式如下:
210.36.21.101 - - [12/Feb/2007:09:43:45 +0800] "GET / HTTP/1.1" 200 38148
210.36.21.101 - - [12/Feb/2007:09:43:45 +0800] "GET /040310/text.css HTTP/1.1" 304 -
210.36.21.101 - - [12/Feb/2007:09:43:45 +0800] "GET /text.css HTTP/1.1" 304 –
观察日志格式后,发现可以用空格来分隔每个字段。不过这样的话,将会有些分散。比如日期与时间会被分成两列:[12/Feb/2007:09:43:45和+0800]。而URL会被分为三列。只能全部以字符的形式导入数据库,然后在进行一些格式转换工作,比如日期等。
1、 创建表
create table weblog
(
cip varchar2(20),
ident varchar2(10),
authorized_user varchar2(10),
access_time varchar2(30),
time_zone varchar2(10),
method varchar2(20),
url varchar2(500), //之前测试的时候,发现有些URL相当长,所以应将该字段的值设大。
protocol varchar2(50),
status varchar2(10),
req_bytes varchar2(100)
);
2、 创建控制文件
//input.ctl
load data
infile 'F:\毕业设计\datasets\广西大学网络日志\www.gxu.edu.001'
infile 'F:\毕业设计\datasets\广西大学网络日志\www.gxu.edu.002'
infile 'F:\毕业设计\datasets\广西大学网络日志\www.gxu.edu.003'
infile 'F:\毕业设计\datasets\广西大学网络日志\www.gxu.edu.004'
replace into table weblog
fields terminated by X'09'
(cip TERMINATED BY WHITESPACE,
ident TERMINATED BY WHITESPACE,
authorized_user TERMINATED BY WHITESPACE,
access_time TERMINATED BY WHITESPACE,
time_zone TERMINATED BY WHITESPACE,
method TERMINATED BY WHITESPACE,
url TERMINATED BY WHITESPACE,
protocol TERMINATED BY WHITESPACE,
status TERMINATED BY WHITESPACE,
req_bytes)
3、使用SQL*LOADER导入
在命令行,使用如下语句:
sqlldr userid=dm/oracle@XYZLOTUS control=F:\毕业设计\DataPreparation\input.ctl log=F:\毕业设计\DataPreparation\weblog.log errors=10000
由于在导入的时候会出现一些错误,比如有些字段太长而被拒绝写入表中。所以应该注意设置errors为一个比较高的值,以免错误数量超过允许的值而中止数据继续导入。如果不显式设置,默认为50。考虑到本实验数据记录庞大,所以我设为errors=10000。
4、 通过日志记录来查看信息
在导入过程中,出现的错误以及导入的相关信息会保存在LOG文件中。
//weblog.log
表WEBLOG:
4213740行加载成功
由于数据错误, 407行没有加载。
由于所有WHEN子句失败, 0行没有加载。
由于所有字段都为空的, 0行没有加载。
为结合数组分配的空间: 165120字节(64行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 4214147
拒绝的逻辑记录总数: 407
废弃的逻辑记录总数: 0
从星期五4月 25 08:14:40 2008开始运行
在星期五4月 25 08:57:20 2008处运行结束
经过时间为: 00: 42: 39.39
CPU时间为: 00: 04: 11.65
5、 登录SQL*PLUS
SQL> select count(*) from weblog;
COUNT(*)
----------
4213740