开发者学堂课程【场景实践-基于阿里云 Quick BI 对 MOOC 网站日志分析:数据预处理和上传】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/524/detail/7076
数据预处理和上传
点击文档进入后在左侧菜单中找到工具及下载,点击客户端。在使用 MaxCompute客户端前,请首先安装并配置客户端。点击该链接进入后会显示如何安装并配置。找到:单击此处下载 MaxCompute 客户端,点击后就会进行下载。下载完成后进行解压。
获取了项目名以及 ID 和 Secret 后就可以进行配置 odps_cmd 命令行工具。此处已经下载好,打开 config 文件夹,打开odps_config.ini,是配置文件。此处需要指定三个主要属性:项目名、ID、access_key
project_name=
access_id=<accesssid>
access_key=<accesskey>
指定后通过 bin 目录下的odpscmd.bat运行,如果是 windows 系统使用它。如果为其它操作系统例如mac可以使用odpscmd(是一个shell脚本)。已经配置好了配置文件,此处使用odpscmd.bat执行。可以看到已经连接成功进入到项目下。
输入show tables就可以看到该项目下的所有表。再来演示数据上传,首先创建表,输入
create table t_test<content string>:
再次输入 show table 就可以看到表名已经创建成功。
再使用命令上传实际数据,输入tunnel upload -fd “nodelimiter” d:\access.log t_test;
回车执行可以看到已经上传成功。再在该表中查询几条数据,输入
select = from t_test limit 5;
执行完成,可以看到每一行确实变为数据库表的每一行。
以上就是数据上传。
九、正则表达式
日志文件格式主体上是以单个空格进行分割,理论上可以通过空格将每一个属性进行分割。但是很多字段中都自带空格,这就导致不能单纯以文本分割形式将属性提取出。所以使用正则表达式。正则表达式是对字符串和特殊字符串操作的一种逻辑公式,使用事先定义好的字符串组合组成一个规则字符串。
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
元字符 |
说明 |
^ |
行首(字符的开始) |
$ |
行尾 |
. |
任意字符 |
* |
匹配零次或多次 |
+ |
匹配1次或多次 |
? |
匹配零次或1次 |
? |
匹配修饰符,当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的,而不指定默认是贪婪模式。(非贪婪模式:当使用一定规则进行匹配时,使用非贪婪模式,则会尽可能少的匹配字符。例对一串数字1-10使用数字匹配模式,若后存在?,则只取第一个数字1。) |
A|B |
A或B |
(abc)* |
匹配abc序列零次或多次 |
{n}或{m,n} |
匹配的次数(可以指定一个具体数字) |
[ab] |
匹配括号中的任一字符,例中模式匹配a或b |
[a-d] |
匹配a,b,c,d任一字符 |
[^ab] |
^表示非,匹配任一非a非 b的字符 |
\ |
转义符 |
\n |
n为数字1-9,后向引用 |
\d |
数字 |
\D |
非数字 |
了解常见元字符后实际对文本数据使用正则表达式进行处理。
十、使用正则提取日志属性
122 112.10.94.234 -- [22/Aug/2017:14:01:26 +0800] "POST /item/detail.mooc HTTP/1.1" 200 2582 "http://www.chinamoocs.com/study/initplay/540.mooc""Mozilla/5.0(Macintosh; Intel Mac OS X 10_12_6)AppleWebKit/603.3.8(KHTML, like Gecko)Version/10.1.2 Safari/603.3.8"
之前在此处增加了一个自增长的ID格式,所以也需要提取ID。每一个属性都以空格分割,但同时需要了解规则。以上有单个数字,有普通字符串,以及一些特殊字符,还有一些以[]的字符串,还有””的字符串可能还有一些独立的空格。在了解后开始编写正则表达式:
INSERT OVERWRITE TABLE t_web_access_log_tmp1
SELECT CAST(regexp_replace(regexp_substr(content,'[[].*?[]]|".*?”|.*? ',1,1),' $',’’)AS BIGINT)AS id, regexp_replace(regexp_substr(content,'[[].*?[]] |".*?”|.*? ',1,2),' $',’’)AS ip
,CAST( regexp_substr(content,'\\d+',1,2)AS BIGINT)* 256 * 256 * 256
+ CAST( regexp_substr(content,'\\d+',1,3)AS BIGINT)* 256 * 256
+ CAST( regexp_substr(content,'\\d+',1,4)AS BIGINT)* 256
+CAST( regexp_substr(content,'\\d+',1,5) AS BIGINT)AS ip_num
, regexp_substr(content,'\\d+',1,2)AS ip_1
,regexp_replace(regexp_substr(content,'[[].*?[]]|".*?"|.*?‘,1,5),’^[[]|[]] $',’’)AS access_time
, regexp_replace(regexp_substr(content,'[[].*?[]]|".*?”|.*?‘,1,6),'^"|" $',’') AS url
, regexp_replace(regexp_substr(content,'[[].*?[]]|".*?"|.*? ‘,1,7),' $',’’)AS status
,regexp_replace( regexp_substr(content,'[[].*?[]]|".*?”|.*? ‘,1,8),' $',"")AS traffic
,regexp_replace( regexp_substr(content,'[[].*?[]]|".*?"”|.*?‘,1,9),’^"|" $',’’)AS referer
, regexp_replace(regexp_substr(content,’".*?"’,1,3),‘^" |"$',’’)AS c_info
FROM t_web_access_log_content;
此处使用的为 MaxCompute DataID 提供的 SQL 语法进行的操作。首先使用regexp_substr 函数,默认需要四个参数,首先为内容字符串,在内容中进行正则的符合的规则字符串提取。在正则表达式后数字参数表示从第一个字符进行使用正则,如果想从特定字符串中进行提取可以指定数字。后面是匹配次数,1代表匹配到字符串的第一次。同时在函数的外部使用了regexp_replace函数,是一个字符串替换的函数,替换方式使用正则表达式。此处的’ $’为去末尾空格操作。正则表达式中[[]与//转义为同一效果,作用是将内部[]以原始形式进行输出,’.’代表任意字符,?为非贪婪模式,尽可能少的匹配。[[].*?[]]表示按之前方式匹配,|表示或,第一种匹配方式没有匹配到查看第二种匹配方式".*?” |.*?,匹配””作为两边包括的一个字符串。如果两种方式都未匹配到,最后使用.*? 匹配到实际的字符串,通过空格方式进行提取。可以提取到每一个属性,是一种通用的方式。由此提取第一个匹配时获取的为id,此处为122。获取第二个匹配时获取到IP。进行第五次匹配时,实际上在进行第三四次匹配时为--,不需要进行跳过,在获取第五次时为访问时间。第六次为实际请求地址,第七次为状态,第八次为发送字节数,第九次是访问来源,最后为用户的客户端信息。最后一次比较特殊,末尾没有空格,所以此处使用独立的正则表达式 ‘“.*?”’ 两边为””,中间为任意字符串,两边都有””的字符串从请求地址作为第一个开始,第二个为referer,第三个为用户客户端信息。由此此处使用第三个作为用户客户端信息,在实际存储时,需要使用正则表达式替换将开头的””以及结尾处的””进行去除,所以将存储为实际内容,并去除了两边的””。
最后来查看内容ip的提取,将ip转换为数字就可以对ip的信息提取进行一个数字的大量比较。所以此处将用户访问的ip进行实际计算,首先使用一个正则表达式,此处使用的为\d,即一个数字匹配,后为+,表示一次或多次,前面还有\,表示将\进行转义。通过正则先匹配到的为id,过滤掉从第二个开始。再计算IP的数字,首先将每一个数字段转换为bigint类型,之后* 256 * 256 * 256,第二位* 256 * 256,第三位* 256,最后一位直接累加。就可以得到ip转数字后的结果。之后还需要进行一个提取,即将ip 的第一个段单独进行保存,实际上是一个优化作用。
以上为提取日志属性的全部内容。