1.日志格式解析
日志示例
2.代码解析
2.1 可以采用序列化/反序列化方式来解析文本文件
CREATE TABLE IF NOT EXISTS test (
ip STRING COMMENT '客户端IP',
dash1 STRING COMMENT '占位符1',
dash2 STRING COMMENT '占位符2',
`time` STRING COMMENT '请求时间',
request STRING COMMENT '客户端请求行',
response_code STRING COMMENT '响应码',
size STRING COMMENT '响应大小(字节)',
referer STRING COMMENT '来源页面的链接',
user_agent STRING COMMENT 'User-Agent')
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^(\\S+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\S+) (\\S+) \"(.*?)\" \"(.*?)\"$",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;
解析代码:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
: 指定使用 RegexSerDe
序列化/反序列化器。
WITH SERDEPROPERTIES
: 设置序列化/反序列化器的属性。"input.regex" = "^(\\S+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\S+) (\\S+) \"(.*?)\" \"(.*?)\"$"
: 定义用于匹配输入数据行的正则表达式。该正则表达式包含多个捕获组,用于提取不同字段的值。"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
: 定义输出数据的格式化字符串,用于将数据行反序列化为字段值。STORED AS TEXTFILE
: 指定数据存储格式为普通文本文件。
2.2 正则表达式解析: `"^(\\S+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\S+) (\\S+) \"(.*?)\" \"(.*?)\"$"`
1. `^(\\S+)`: 匹配一系列非空字符,表示客户端IP地址。
2. `(\\S+)`: 匹配一系列非空字符,表示标识符(可以是任何非空字符串)。
3. `(\\S+)`: 匹配一系列非空字符,表示用户标识。
4. `\\[([\\w:/]+\\s[+\\-]\\d{4})\\]`: 匹配形如 `[日期时间]` 的字符串,其中日期和时间由多个字母、数字、冒号和斜杠组成,并且后面跟着一个表示时区偏移量的加号或减号,然后是四位数的时区偏移。
5. `\"(.+?)\"`: 匹配被双引号包围的任意字符串,表示请求行。
6. `(\\S+)`: 匹配一系列非空字符,表示响应状态码。
7. `(\\S+)`: 匹配一系列非空字符,表示响应大小。
8. `\"(.*?)\"`: 匹配被双引号包围的任意字符串,表示引用页面。
9. `\"(.*?)\"`: 匹配被双引号包围的任意字符串,表示用户代理。
通过使用这个正则表达式,Hive 将根据输入数据行的格式将相应的部分提取为表的列
3.结果