网站流量日志分析--统计分析--新老访客实现(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 )

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
Linux 应用服务中间件 PHP
性能工具之linux常见日志统计分析命令
通过本文的介绍,我相信同学们一定会发现 linux三剑客强大之处。在命令行中,它还能够接受,和执行外部的 AWK 程序文件,可以对文本信息进行非常复杂的处理,可以说“只有想不到的,没有它做不到的。
391 1
|
9月前
|
人工智能 运维 监控
一招高效解析 Access Log,轻松应对泼天流量
一招高效解析 Access Log,轻松应对泼天流量
174 0
一招高效解析 Access Log,轻松应对泼天流量
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
存储 Java 关系型数据库
基于JSP的九宫格日志网站
基于JSP的九宫格日志网站
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
561 2
|
监控 安全 前端开发
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
268 0
|
存储 弹性计算 监控
日志服务SLS最佳实践:通过SLS数据加工从VPC flowlog中过滤出跨region CEN流量
本文就通过一个客户的实际案例开介绍如何使用在无法直接开启CEN flowlog的情况下,使用SLS的数据加工能力,从VPC flowlog的数据中过滤出客户需要的流量日志出来。
641 0
日志服务SLS最佳实践:通过SLS数据加工从VPC flowlog中过滤出跨region CEN流量
|
7月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
834 54
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
373 9