大数据系列(四)数据仓库hive后续之对日志文件的统计

介绍表的类型

不想看表以及一些基本操作的,直接跳到日志统计 -。- ~~

内部表

我们之前创建了hive_test_table,并且有一个字段id,我们来使用desc formatted hive_test_table;来查看一下表类型,如下图,表类型是MANAGERD_TABLE
在这里插入图片描述
我们之前通过insert,给此表加入了一条数据,然后hadoop fs -ls /user/hive/warehouse/hive_test.db/hive_test_table发现hadoop路径下果然有000000_0文件,里面果然是我们insert的数据

我们切回hive,使用==drop table hive_test_table;==删除了此表,我们执行上面hadoop命令,发现已经找不到这个文件夹了,使用hive sql查询,也提示找不到这个表。我们再去mysql中tbs表中,发现meta数据也被删除了。

外部表

我们先来创建一个外部表,在hive中执行:
注意需要指定表在hadoop中的位置

create external table hive_test(id int,name string) location '/external/table';

我们发现,在msyql的tbs表中,已经创建一条数据,但是类型是external, 我们查看hadoop上文件,发现只有/external/table,但是下面并没有任何其他文件夹
我们使用inert操作插入数据:

insert into hive_test values(1,'test');

我们看到hadoop上已经有了数据文件,那么我们再次执行drop操作:

drop table ive_test;

我们发现表已经被删除,但是mysql中tbs数据没有删除,hadoop上的数据文件也没删除

我们再来一波骚操作,重新把这个表创建出来:

create external table hive_test(id int,name string) location '/external/table';

然后我们在查询一下,发现尼玛,数据又有了。

分区表

顾名思义,有点类似分表操作,比如我们现在数据需要按天统计进行存储,我们可以建立分区表,按天分区,存储在不同块内
我们来创建一个分区表,按照天进行划分,指定数据每列分隔符是空格:

create table access_log(
ip string,
create_time string,
method string,
success int,
res int
) partitioned by (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
location '/hive/log/table';

我们来导入数据,首先看下日志格式(还是博主之前的用MR统计的日志,只不过稍微做了一下etl):

27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/faq.gif-HTTP/1.1 200 1127
110.52.250.126 30/May/2013:17:38:200800 GET/data/cache/style_1_widthauto.css?y7a-HTTP/1.1 200 1292
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/hot_1.gif-HTTP/1.1 200 680
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/hot_2.gif-HTTP/1.1 200 682
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/filetype/common.gif-HTTP/1.1 200 90
110.52.250.126 30/May/2013:17:38:200800 GET/source/plugin/wsh_wx/img/wsh_zk.css-HTTP/1.1 200 1482
110.52.250.126 30/May/2013:17:38:200800 GET/data/cache/style_1_forum_index.css?y7a-HTTP/1.1 200 2331
110.52.250.126 30/May/2013:17:38:200800 GET/source/plugin/wsh_wx/img/wx_jqr.gif-HTTP/1.1 200 1770
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/recommend_1.gif-HTTP/1.1 200 1030
110.52.250.126 30/May/2013:17:38:200800 GET/static/image/common/logo.png-HTTP/1.1 200 4542
27.19.74.143 30/May/2013:17:38:200800 GET/data/attachment/common/c8/common_2_verify_icon.png-HTTP/1.1 200 582
110.52.250.126 30/May/2013:17:38:200800 GET/static/js/logging.js?y7a-HTTP/1.1 200 603
8.35.201.144 30/May/2013:17:38:200800 GET/uc_server/avatar.php?uid=29331&size=middle-HTTP/1.1 301 -
27.19.74.143 30/May/2013:17:38:200800 GET/data/cache/common_smilies_var.js?y7a-HTTP/1.1 200 3184
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/pn.png-HTTP/1.1 200 592
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/common/swfupload.swf?preventswfcaching=1369906718144-HTTP/1.1 200 13333
27.19.74.143 30/May/2013:17:38:200800 GET/static/image/editor/editor.gif-HTTP/1.1 200 13648
8.35.201.165 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/05/94/42_avatar_middle.jpg-HTTP/1.1 200 6153
8.35.201.164 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/03/13/51_avatar_middle.jpg-HTTP/1.1 200 5087
8.35.201.163 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/04/87/94_avatar_middle.jpg-HTTP/1.1 200 5117
8.35.201.165 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/01/01/03_avatar_middle.jpg-HTTP/1.1 200 5844
8.35.201.160 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/04/12/85_avatar_middle.jpg-HTTP/1.1 200 3174
8.35.201.164 30/May/2013:17:38:210800 GET/uc_server/avatar.php?uid=53635&size=middle-HTTP/1.1 301 -
8.35.201.163 30/May/2013:17:38:210800 GET/static/image/common/arw_r.gif-HTTP/1.1 200 65
8.35.201.166 30/May/2013:17:38:210800 GET/static/image/common/px.png-HTTP/1.1 200 210
8.35.201.144 30/May/2013:17:38:210800 GET/static/image/common/pmto.gif-HTTP/1.1 200 152
8.35.201.161 30/May/2013:17:38:210800 GET/static/image/common/search.png-HTTP/1.1 200 3047
8.35.201.163 30/May/2013:17:38:210800 GET/uc_server/avatar.php?uid=57232&size=middle-HTTP/1.1 301 -
8.35.201.164 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/05/83/35_avatar_middle.jpg-HTTP/1.1 200 7171
8.35.201.160 30/May/2013:17:38:210800 GET/uc_server/data/avatar/000/01/54/22_avatar_middle.jpg-HTTP/1.1 200 5396
8.35.201.166 30/May/2013:17:38:210800 GET/static/image/common/arrow_top.gif-HTTP/1.1 200 51
8.35.201.160 30/May/2013:17:38:210800 GET/static/image/common/arw_l.gif-HTTP/1.1 200 844
8.35.201.144 30/May/2013:17:38:210800 GET/static/image/common/qmenu.png-HTTP/1.1 200 1744

我们先把上面的数据拆分成access1和access2两个文件,然后按照分区分别导入到表里,加上local,表示从本地文件导入,不加local,表示从hdfs的路径导入:

load data local inpath '/root/access1' overwrite into table access_log partition (day='2019-05-09');
load data local inpath '/root/access1' overwrite into table access_log partition (day='2019-05-10');

我们来查询一下数据:select * from access_log:

在这里插入图片描述

我们再去web上面看看:
在这里插入图片描述

总结

1.普通创建一个表,是内部表,内部表一旦删除,连带meta信息以及hadoop原始文件全部删除
2.使用external可以创建外部表,外部表只是一层映射关联,功能与内部表一样,但是删除外部表,不会删除meta信息以及hadoop上的文件信息
3.在生产环境上,优先考虑外部表,并且对所有数据存储位置做设计。让表更加轻量
4.分区表可以帮助我们对数据更好的管理,虽然明面上是sql,但是底层依然是文件系统,想来大家整理文件,肯定都会分层、分文件夹。

先熟悉一波DML和DDL操作

创建表

create table access_log(
	ip string,
	create_time string,
	method string,
	success int,
	res int
)

创建外部表(删除后不会删除meta以及hdfs数据)

create external table access_log(
	ip string,
	create_time string,
	method string,
	success int,
	res int
)
location '/hive/log/table';

创建表并且指定每列的分割字符

比如文件里面数据格式如下, 每列的数据都是按照空格:

27.19.74.143 30/May/2013:17:38:200800 GET/static/image/editor/editor.gif-HTTP/1.1 200 13648

然后我们使用ROW FORMAT DELIMITED FIELDS TERMINATED BY ’ ':

create table access_log(
ip string,
create_time string,
method string,
success int,
res int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
location '/hive/log/table';

导入本地数据

导入本地数据

load data local inpath ‘/root/access1’ overwrite into table access_log;

导入hadoop上面文件的数据:

load data inpath ‘/root/access1’ overwrite into table access_log;

剩下的就不写拉,纯粹为来加点内容。api和操作手册没有比官网更爽了。

对日志进行统计

上面几乎都说了,这个章节说啥呢?在来一遍把

首先,来把数据入库

我们数据还是使用上面的日志数据,我们首先创建一个内部表(为啥内部表,因为博主后续要删掉):

create table access_log_demo(
ip string,
create_time string,
method string,
success int,
res int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
location '/hive/log/table';

然后我们来把上面日志的数据扔进去:

load data local inpath '/root/access' overwrite into table access_log_demo;

ok拉。数据入库拉

然后我们来统计所有api成功的次数

来来来,统计成功次数?是不是group by。sql大家都会了对吧

select count(0) from access_log_demo group by success having success=200;

统计所有api失败的次数

来,继续sql

select count(0) from access_log_demo group by success having success=0;

实在扯不下去了

sql实在扯不下去了,大家尽情high吧

发布了38 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zl592886931/article/details/90049733
今日推荐