case when用法_CASE … WHEN和cast类型转换(Hive日志案例分析应用)

37b50b4d4aadf49bd84d9cea5da80357.png

先补充两个知识点:CASE … WHEN和CAST类型转换

CASE … WHEN…的用法

创建数据库

e69ada83c0725beb6862810c2d2964e3.png

创建员工表

create table emp(

empno int comment '员工编号',

ename string comment '员工姓名',

job string comment '员工职位',

mgr int comment '领导编号',

hiredate string comment '入职时间',

sal double comment '薪资',

comm double comment '奖金',

deptno int comment '部门编号'

)row format delimited fields terminated by 't';

190a939d96c290f8b7ed167c77a7e081.png

将数据上传

70d84091619ea8723e5c3b2b5257cb25.png

导入数据

load data local inpath '/data/test/emp.txt' into table emp;

de2ce5f49ec4d70eedd4184b1519d6fd.png

查看数据

88855d347f6e6da1642dd5d1baf922cd.png

其中comm有很多null值

select comm from emp;

b843e6c24bc22c85395e431de8aaa3e8.png

那怎么不让comm这列显示为Null呢?

就可以使用case when,语句

select empno,

case

when comm is NULL then sal+0

else sal+comm

end

from emp;

c8cfc319c85afd633b5ff26068ca4e02.png

可以加别名,进行多层判断。语句

select empno,

case

when sal< 1000 then 'low'

when sal >=1000 and sal < 3000 then 'middle'

when sal >=3000 and sal < 5000 then 'high'

else 'very high'

end

from emp;

5e801f8923b0d0f10a48aa2046dd58f0.png

cast类型转换

查看下表结构

e674b52557828f4dd292cfd803a60f83.png

我们将double类型转换为string类型

语句

create table cast_table as select empno,ename ,job ,cast(sal as string) new_sal from emp;

028d1522336278fe1506caa9d139d431.png

查看表结构

019956e87577f895da0daf2793866317.png

日志案例需求分析:

指标:

(1)日期:最后统计分析的时候根据日期进行分组,可以建立分区表

(2)PV:count(url)

(3)UV: count(distinct guid)

(4)登录人数:user_id 有值,可以登录

(5)游客人数:user_id 无值,非登录人员

(6)平均访问时长:每个用户登录页面之后都会产生一个session_id,统计每个session会话平均的停留时间。求到访问时长:进入页面第一条时间戳,最后离开页面的最后一条时间戳。平均访问时长:按照session_id进行分组,求到平均访问时长。

(7)二跳率:一个用户在一个session会话中,点击的页面大于等于2的次数就是二跳率。求访问页面超过2的用户,统计PV大于等于2的用户再除以总的人数。

(8)独立ip:统计ip去重

开始将数据导入到Hive中

创建数据库

Create database track_log_ip;

a223f9d5948a708e9a4c0f74ed51de8e.png

使用数据库

82d12e08dc4ab1392016c9651405c44a.png

创建表

create table log_ip_source(

id string,

url string,

referer string,

keyword string,

type string,

guid string,

pageId string,

moduleId string,

linkId string,

attachedInfo string,

sessionId string,

trackerU string,

trackerType string,

ip string,

trackerSrc string,

cookie string,

orderCode string,

trackTime string,

endUserId string,

firstLink string,

sessionViewNo string,

productId string,

curMerchantId string,

provinceId string,

cityId string,

fee string,

edmActivity string,

edmEmail string,

edmJobId string,

ieVersion string,

platform string,

internalKeyword string,

resultSum string,

currentPage string,

linkPosition string,

buttonPosition string

)partitioned by(date string)

row format delimited fields terminated by 't';

09f15286233cf9aed9c2377cb6f65e79.png

导入数据

load data local inpath '/data/test/data1' into table log_ip_source partition(date='2015082818');

fb4ac104133ddeb43575eacf0c939efa.png

数据清洗

会话信息的关键指标:

trackerU:访问渠道:通过什么方式进入到网站:收藏夹、手输网址、论坛、博客等

landing_url着陆页:用户进入网站的第一个页面,需要获取第一条记录,分析同一个session会话中的第一个页面。

Landing_url_ref着陆页之前的页面:需要获取第一条记录

创建会话信息表

create table session_info(

session_id string ,

guid string ,

trackerU string ,

landing_url string ,

landing_url_ref string ,

user_id string ,

pv string ,

stay_time string ,

min_trackTime string ,

ip string ,

provinceId string

)partitioned by (date string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' ;

ba7e69f8af8d3a0f58912381de434a41.png

加载数据

针对每个会话进行一个group by sessionId

由于sessionid分组之后会得到多条记录 ,那么就是对于每个session里面统计pv

创建临时表

create table session_tmp as

select

sessionId session_id,

max(guid) guid,

max(endUserId) user_id,

count(distinct url) pv,

(unix_timestamp(max(trackTime)) - unix_timestamp(min(trackTime)) ) stay_time,

min(trackTime) min_trackTime,

max(ip) ip,

max(provinceId) provinceId

from log_ip_source where date='2015082818'

group by sessionId;

8dd50c6f60c439e2be2e9ef6591b8209.png

这三个字段

trackerU,landing_url,landing_url_ref

(1)从源表中获取每一条记录的trackerU,landing_url,landing_url_ref

(2)从源表中获取每一条记录的时间

(3)然后进行最小时间与源表当中最小时间的join,获取到trackerU,landing_url,landing_url_ref

创建第二张临时表

create table track_tmp as

select

sessionId session_id,

trackTime trackTime,

url landing_url,

referer landing_url_ref,

trackerU trackerU

from log_ip_source

where date='2015082818';

dc139dd5420931e74664844421c90400.png

Join连接

insert overwrite table session_info partition(date='2015082818')

select

a.session_id session_id,

max(a.guid) guid,

max(b.trackerU) trackerU,

max(b.landing_url) landing_url,

max(b.landing_url_ref) landing_url_ref,

max(a.user_id) user_id,

max(a.pv) pv,

max(a.stay_time) stay_time,

max(a.min_trackTime) min_trackTime,

max(a.ip) ip,

max(a.provinceId) provinceId

from session_tmp a join track_tmp b on

a.session_id = b.session_id and a.min_trackTime = b.trackTime

group by a.session_id;

c7294c687fe21465c4a1eee28dc0bbf0.png

32dd7df9d7ac5398212d892195ab414e.png

数据分析

语句

create table result as

select

date date,

sum(pv) pv,

count(distinct guid) guid,

count( distinct case when user_id is not null then guid else null end ) login_user,

count( distinct case when user_id is null then guid else null end ) visitor,

avg(stay_time) avg_time,

(count(case when pv>2 then session_id else null end)/count(session_id) ) session_jump,

count(distinct ip) ip

from session_info where date='2015082818'

group by date;

43634b0603e7957cad0efe4c655d903e.png

查看下结果

82b7112daf1b0bec787f8004934ed1ba.png

这个地方有问题,游客人数为0

11955335ca601b08ca241f2cdaf0d123.png

重新写语句

create table qw as

select

date date,

sum(pv) PV,

count(distinct guid) UV,

count(distinct case when length(user_id)!=0 then guid else null end) login_user,

count(distinct case when length(user_id)=0 then guid else null end) visitor,

avg(stay_time) avg_time,

(count(case when pv>=2 then session_id else null end)/count(session_id)) second_jump,

count(distinct ip) IP

from session_info

where date='2015082818'

group by date;

0af4f34a9ca6b3abd83fdffaeb860f57.png

查看结果

7bedbd7f6ef573f1e0f2fe4b1969d0b7.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值