搜狗搜索日志分析系统实现--数据预处理

给定一个500万行和5000万行的搜狗搜索日志,如何利用大数据去构建一个搜索日志分析系统。该系列教程记录如何完成这个系统。

构建系统前,需要了解如何进行数据相关的预处理

查看数据

less命令

less ./sogou.500w.utf8

less 与 more 类似,但使用 less 可以随意浏览文件,而且 less 在查看之前不会加载整个文件。[b]键位翻到上一页,[space]键位向后一页。

wc命令

wc -l ./sogou.500w.utf8
参数 含义
-c 统计字节数
-l 统计行数
-m 统计字符数,不能和-c标志一起使用
-w 统计字数

截取部分数据

head -2 ./sogou.500w.utf8 # 获取前2行

数据拆分

将时间字段拆分并拼接,添加年、月、日、小时字段

bash sogou-log-extend.sh ./sogou.500w.utf8 ./sogou.500w.utf8.ext

利用bash命令执行sogou-log-extend.sh文件,该文件的内容如下:

#!/bin/bash
#infile=/data/sogou-data/sogou.500w.utf8
infile=$1
#outfile=/data/sogou-data/sogou.500w.utf8.final
outfile=$2
awk -F '\t' '{print $0"\t"substr($1,0,4)"\t"substr($1,4,2)"\t"substr($1,6,2)"\t"substr($1,8,2)}' $infile > $outfile

在Shell存在一些特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

有关awk的使用方法,请猛戳AWK简明教程

数据过滤

过滤第 2 个字段(UID)或者第 3 个字段(搜索关键词)为空的行

bash sogou-log-filter.sh ./sogou.500w.utf8.ext ./sogou.500w.utf8.flt

利用bash命令执行sogou-log-filter.sh文件,文件内容如下:

#!/bin/bash
#infile=/data/sogou-data/sogou.500w.utf8.ext
infile=$1
#outfile=/data/sogou-data/sogou.500w.utf8.flt
outfile=$2
awk -F "\t" '{if($2 != "" && $3 != "" && $2 != " " && $3 != " ") print $0}' $infile > $outfile

请确认Hadoop伪分布式已经启动,数据加载到HDFS上。

hadoop fs -mkdir -p /sogou/20111230
hadoop fs -put ./sogou.500w.utf8 /sogou/20111230
hadoop fs -mkdir -p /sogou_ext/20111230
hadoop fs -put ./sogou.500w.utf8.flt /sogou_ext/20111230