网站流量日志分析--统计分析--新老访客实现(join 语句)|学习笔记

简介: 快速学习网站流量日志分析--统计分析--新老访客实现(join 语句)

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段) 网站流量日志分析--统计分析--新老访客实现(join 语句)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/696/detail/12240


网站流量日志分析--统计分析--新老访客实现(join 语句)


1、每天新访客的一个 sql 编写的过程如何编写如何计算打开笔记在计算新老访客时涉及到两个表之间的 join 关联确定哪两个表关联的字段是两个表进行左关联以历史进行 ip 判断关联上的为老仿客关联不上显示为 null 的为新访客

--框架

select

from今天left join 史on今天.ip =历史.ip

左关联以左表为准如果右边的为 null 就是新访客

Select

今天.ip

from今天left join 史on今天.ip =史.ip

where历史.ip is null;--新访客

Select

今天.ip

from今天left join 史on今天.ip =史.ip

where历史.ip is not null;--老访客

is not null 意味着不为空不为空意味着以关联上两个框架就可以计算出新老访客

2、根据业务分析想要得到今天的访客必须对今天的访问日志数据进行去重ip去重完之后所有的 ip 就是今天的访客记录一款表为准宽表中有 remote_addr字段把所有 ip 进行去重得到今天所有的ip就是所有的访客

--今天(根据今天收集的数据进行去重统计)

select

distinct t.remote_ addr as ip

把所有ip都拿出来包括重复的所以进行去重起别名

from dw_ weblog_ detail t where t. datestr ="20181101";

复制打开 hive 终端执行

得到ip 是今天不重复的独立访客数历史表根据业务查询出得到还是需要自己提前创建好每天不断的进行填充今天开业第一天没有任何人表示空开业第二天把第一天数据拿过来所以根据业务的梳理可以发现历史累计表是自己需要提前创建的当然必须要有 ip 字段这样才能进行判断因此历史累计表需要自己提前创建

image.png

创建 dw user_ dsct_ history 历史用户去重累计有 ip 字段历史表需要根据需求自己创建

--历史

drop table dw user_ dsct_ history;

create table dw user_ dsct_ history (

day string , 表示哪一天

ip string  ip很重要

partitioned by (datestr string) ;

代入框架进行填充

Select

今天.ip

from今天left join 史on今天.ip =史.ip

where历史.ip is null;--新访客

今天的表要进行替换今天的表是 sql 语句查询进行嵌套查询起别名 today历史起别名 history确定了两个表确定 join 字段join 字 段要跟表对应上把历史换成 history把今天换成 today得到的就是今天的新访客

select

today.ip

from (select

distinct t.remote_ addr as ip

from dw_ weblog_ detail t where t datestr ="20181101") today left join

dw_ user_ dsct_ history history on today.ip = history.ip

where history.ip is null;--新访客

复制历史表打开终端进行执行今天是上线的第一天历史表中没有数据所以所有访客都是新访客执行报错对sql进行修正修改空格格式问题

Select today.ip from

(select distinct t.remote_ addr as ip from dw_ weblog_ detail t where t datestr ="20181101") today left join dw_ user_ dsct_ history history on today.ip = history.ip

where history.ip is null;--新访客

执行可以看到今天的新访客今天没有老访客的数据

Select today.ip from

(select distinct t.remote_ addr as ip from dw_ weblog_ detail t where t datestr ="20181101") today left join dw_ user_ dsct_ history history on today.ip = history.ip

where history.ip is not null;--老访客

验证是否有老访客结果返回为空说明今天没有一个老访客从 s ql 层面完成了新老访客的计算

3、创建每日新访客表

drop table dw_ user_ new_ d;

create tab1e dw_ user_ new d (

day string ,

ip string

partitioned by (datestr string) ;

4、每日新用户插入新访客表

insert into table dw_ user_ new_ d partition (datestr= '20181101')

select tmp.day as day, tmp.today_ addr as new_ ip from

select today.day as day, today. remote_ addr as today_ addr,old.ip as old_ addr

from

(select distinct remote_ addr as remote_ addr,"20181101" as day from dw_ weblog_ detail where datestr ="20181101") today

left outer join

dw_ user_ dsct_ history old

on today. remote_ addr=old. ip

) tmp

where tmp.old_ addr is null;

里面做了多重嵌套查询today 和 history 进行关联起别名是 old关联完进行判断就是新访客进行 insert 插入语句创建完之后还要进行追加的操作根据需求要把当天的新访客追加到历史表中作为老访客作为判断因为当下的数据只有一天所有的新访客课插到历史表中,数据计算一遍新访客就没有都是老访客进行相反的过程把新访客追加到历史表中进行插入打开 hive 终端进行执行

--每日新用户追加到累计表

insert into table dw_ user_ dsct_ history partition (datestr= '20181101')

select day,ip from dw_ user_ new_ d where datestr= '20181101' ;

验证新老访客以老访客为例没有新访客都是老访客验证复制 sql 执行颠倒的过程结果显示没有新访客因为所有的都变成了老访客这就是 sql 层面计算新老访客的过程

验证:

select count (distinct remote_ addr) from dw_ weblog_ detail ;

select count(l) from dw_ user_ dsct_ history where datestr= '20181101' ;

select count(1) from dw_ user_ new_ d where datestr=

'20181101' ;

5hive 中 join 的总结

today 就不是真实的表而是通过查询语句返回的结果作为一个表表很重要确定表确认 join 字段后进行判断join 返回什么字段是业务的问题没有具体的规定但是很重要确定表和字段填充进去就可以写出 sql在需求中如果需求涉及到两元操作就是一个对立的面不好没有没有访客如果需求从两元操作都可以转化成 join sql 语句执行因为 join 的本质最终也是两种结果nullnot null把新老访客的新没有关联上做了个关联新访客 null,老访客 not null业务上的扩展空不空判断好不好

(1)join 语句最重要的是确定 join 的表和 join 字段

(2)因为 join 的表可能真是存在也可能不存在

(3)如果不存在设法通过嵌套查询生成表结构实质是一个虚拟的表

(4)如果涉及到需求中的两元操作(好或者不好来或者不来新或者旧)都可以往 join上进行扩展因为 join 的结果本身也是两种情况( null, not null )

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
27 2
|
3月前
|
小程序 Linux 数据安全/隐私保护
Linux学习笔记十六:日志管理
Linux学习笔记十六:日志管理
|
3月前
|
监控 安全 前端开发
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
33 0
|
5月前
|
Java
JVM学习笔记-如何在IDEA打印JVM的GC日志信息
若要在Idea上打印JVM相应GC日志,其实只需在Run/Debug Configurations上进行设置即可。
66 0
|
6月前
|
缓存 NoSQL Redis
Redis学习笔记-AOF日志&重写机制
Redis学习笔记-AOF日志&重写机制
82 0
|
6月前
|
NoSQL Redis
Redis学习笔记-AOF 日志和 RDB快照
Redis学习笔记-AOF 日志和 RDB快照
65 0
|
6月前
|
SQL 存储 关系型数据库
MySQL学习笔记-redo log 和 binlog&两阶段提交
MySQL学习笔记-redo log 和 binlog&两阶段提交
61 0
|
21天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
75 1
|
22天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
77 1
|
26天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位

热门文章

最新文章