假如我们要对每天的日志进行统计PV,UV等信息,一般情况下会每天产生一个日志目录。我们在使用hive会就可以每天创建一个hive表分区,方便数据统计、分析、分散压力。hive分区表有静态分区和动态分区。

准备测试数据:

 log_20200401.txt
 192.168.1.3,http://www.test.cn/sg,2020-04-01 11:30:20
 192.168.2.4,http://www.test.cn/log,2020-04-01 11:35:20
 192.168.4.4,http://www.test.cn/sg,2020-04-01 11:30:20
  
 log_20200402.txt
 192.168.1.3,http://www.test.cn/sg,2020-04-02 11:30:20
 192.168.3.3,http://www.test.cn/log,2020-04-02 11:35:20
 192.168.5.4,http://www.test.cn/sg,2020-04-02 11:30:20
  
 log_20200403.txt
 192.168.1.3,http://www.test.cn/sg,2020-04-03 11:30:20
 192.168.3.5,http://www.test.cn/log,2020-04-03 11:35:20
 192.168.5.2,http://www.test.cn/sg,2020-04-03 11:30:20
  
 log_20200406.txt
 192.168.1.3,http://www.test.cn/sg,2020-01-02 11:30:20
 192.168.3.5,http://www.test.cn/log,2020-02-09 11:35:20
 192.168.5.2,http://www.test.cn/sg,2020-03-04 11:30:20 

静态分区表

create table log_access(ip string,url string,access_time string)
 partitioned by (ddate string) row format delimited fields terminated by ',';

我们按天进行数据分区。

导入本地数据(导入数据会自动创建分区)

 load data local inpath '/Users/hecj/Desktop/hive/log_20200401.txt' into table log_access partition(ddate ='20200401');
 load data local inpath '/Users/hecj/Desktop/hive/log_20200402.txt' into table log_access partition(ddate ='20200402');
 load data local inpath '/Users/hecj/Desktop/hive/log_20200403.txt' into table log_access partition(ddate ='20200403');
 load data local inpath '/Users/hecj/Desktop/hive/log_20200406.txt' into table log_access partition(ddate ='20200406'); 

导入hdfs目录数据(导入数据会自动创建分区)

load data inpath '/ext_access/20200406' overwrite into table log_access partition(ddate ='20200406'); 

注:日志数据在hdfs目录/ext_access/20200406下。

导入数据后分区表目录

查看表的分区

 hive> show partitions log_access;
 OK
 ddate=20200401
 ddate=20200402
 ddate=20200403
 ddate=20200404
 ddate=20200405
 ddate=20200406

1.添加分区

alter table log_access add partition (ddate =’20200404′);

添加分区后可以将数据导入到分区目录下

/user/hive/warehouse/testdb.db/log_access/ddate=20200404

2.添加分区时指定location

alter table log_access add partition(ddate =’20200405′) location ‘/ext_access/20200405’;

也就是说分区的文件不一定要在/user/hive/warehouse/testdb.db/log_access目录下。

如果想要为内部表预先创建分区,需要使用hadoop fs  –mkdir命令在表目录下先创建相应的分区目录,然后再使用alter table add partition语句增加分区。

删除分区

alter table log_access drop partition (ddate =’20200404′);

求4月1号以后,每天每个页面的总访问次数,及访问者中ip地址中最大的

 select ddate,url,count(1),max(ip)
 from log_access
 where ddate>'2020-04-01'
 group by ddate,url; 

动态分区表

使用动态分区表需要先设置

 set hive.exec.dynamic.partition=true;
 set hive.exec.dynamic.partition.mode=nonstrict; 

创建分区表

 create table log_access2(ip string,url string,access_time string)
 partitioned by (month string) row format delimited fields terminated by ','; 

我们重新对log_access进行动态分区,使用access_time字段按年月(如2020-04)进行分区。

从log_access查询数据,并按month分区

insert overwrite table log_access2 partition(month) select ip,url,access_time,substring(access_time,1,7) as month from log_access;

导入后,会重新复制一份数据到log_access2表目录下,按照年月分区。

导入数据后分区表目录

每月url访问次数统计:

 select month,url,count(1) from log_access2
 where month>'2020-01'
 group by month,url; 

发表评论

电子邮件地址不会被公开。 必填项已用*标注