Hive实战项目——影音网站数据分析

Hive实战项目——影音网站数据分析,第1张

统计 谷粒视频 网站的常规指标,各种 TopN 指标:

对将要处理的数据先进行一次数据清洗,过滤掉不合格的脏数据,同时调整数据的格式

pomxml

ETLUtilMapperjava

ETLUtilDriverjava

处理前数据

处理后数据

gulivideo_ori

guli_user_ori

321 将表中category字段数组行转列

select views,hot from

gulivideo_orc lateral view explode (category) category_t as hot;t1

322 统计每个类别的观看总数

select hot,count()

from t1

group by hot;t2

323 获取观看前10的类别

select hot,total_view

from ()t2

order by total_view desc limit 10;

331 观看数top20视频

select views,category

from gulivideo_orc

order by views desc

limit 20;t1

332 所属类别

select views,category

from t1 lateral view explode(category)ct as category_name;

341 观看数top10,关联视频

select

videoid,views,category,relatedid

from

gulivideo_orc

order by

views desc

limit 50;t1

342 关联视频行转列

select distinct(r_id)

from

t1 lateral view explode(relatedid) relatedtable as r_id;t2

343 视频所属类别

select r_id,gcategory

from

t2join gulivideo_orc g on r_id = gvideoid;t3

select r_id,gcategory

from

t2 join gulivideo_orc g on r_id = gvideoid;t3

344 类别展开

select category_name

from ()t3 lateral view explode(category)t as category_name;t4

345 统计类别个数

select category_name,count() hot

from

t4 group by category_name,t_sum;t5

346 所属类别排名

select from

t5

order by hot desc;t6

1找出上传前10的用户

select uploader,

videos

from

guli_user_orc

order by videos desc

limit 10;t1

2找到上传的所有视频

select t1uploader,

videoid,

views

from

()t1 join gulivideo_orc g

on

tuploader=guploader

order by uploader,views desc; t2

1统计所有类别对应的视频

select

category_name,videoid,views

from

gulivideo_orc

lateral view explode(category) t as category_name;t1

2对每个类观看数排名

select ,rank() over(partition by category_name order by views desc) rank_no

from

()t1;t2

3取前十

select from

()t2

where rank_no<=10;

1.语法

(1)load data:表示加载数据

(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

(3)inpath:表示加载数据的路径

(4)overwrite:表示覆盖表中已有数据,否则表示追加

(5)into table:表示加载到哪张表

(6)student:表示具体的表

(7)partition:表示上传到指定分区

2.实 *** 案例

(0)创建一张表

(1)加载本地文件到hive

(2)加载HDFS文件到hive中

上传文件到HDFS

加载HDFS上数据

(3)加载数据覆盖表中已有的数据

上传文件到HDFS

加载数据覆盖表中已有的数据

1.创建一张分区表

2.基本插入数据

3.基本模式插入(根据单张表查询结果)

4.多插入模式(根据多张表查询结果)(有问题,只是查询单表不同分区的)

根据查询结果创建表(查询的结果会添加到新创建的表中)

1.创建表,并指定在hdfs上的位置

2.上传数据到hdfs上

3.查询数据

注意:先用export导出后,再将数据导入。

1.将查询的结果导出到本地

2.将查询的结果格式化导出到本地

3.将查询的结果导出到HDFS上(没有local)

基本语法:(hive -f/-e 执行语句或者脚本 > file)

后续。

注意:Truncate只能删除管理表,不能删除外部表中数据

1.全表查询

2.选择特定列查询

注意:

(1)SQL 语言大小写不敏感。

(2)SQL 可以写在一行或者多行

(3)关键字不能被缩写也不能分行

(4)各子句一般要分行写。

(5)使用缩进提高语句的可读性。

1.重命名一个列

2.便于计算

3.紧跟列名,也可以在列名和别名之间加入关键字‘AS’

4.案例实 ***

查询名称和部门

(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。

(2)where后面不能写分组函数,而having后面可以使用分组函数。

(3)having只用于group by分组统计语句。

空字段赋值

5CASE WHEN

需求

求出不同部门男女各多少人。结果如下:

创建本地emp_sextxt,导入数据

创建hive表并导入数据

按需求查询数据

Order By:全局排序,一个Reducer

1.使用 ORDER BY 子句排序

ASC(ascend): 升序(默认)

DESC(descend): 降序

2.ORDER BY 子句在SELECT语句的结尾

3.案例实 ***

(1)查询员工信息按工资升序排列

(2)查询员工信息按工资降序排列

按照员工薪水的2倍排序

按照部门和工资升序排序

Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。

1.设置reduce个数

2.查看设置reduce个数

3.根据部门编号降序查看员工信息

4.将查询结果导入到文件中(按照部门编号降序排序)

Distribute By:类似MR中partition,进行分区,结合sort by使用。

注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

案例实 *** :

当distribute by和sorts by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

1)以下两种写法等价

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

hive字符串函数

1 字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:

hive> select length('abcedfg') from lxw_dual;

7

2 字符串反转函数:reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:

hive> select reverse(abcedfg') from lxw_dual;

gfdecba

3 字符串连接函数:concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

举例:

hive> select concat('abc','def','gh') from lxw_dual;

abcdefgh

4 带分隔符字符串连接函数:concat_ws

语法: concat_ws(string SEP, string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

举例:

hive> select concat_ws(',','abc','def','gh') from lxw_dual;

abc,def,gh

5 字符串截取函数:substr,substring

语法: substr(string A, int start),substring(string A, int start)

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:

hive> select substr('abcde',3) from lxw_dual;

cde

hive> select substring('abcde',3) from lxw_dual;

cde

hive> selectsubstr('abcde',-1) from lxw_dual; (和ORACLE相同)

e

6 字符串截取函数:substr,substring

语法: substr(string A, int start, int len),substring(string A, intstart, int len)

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:

hive> select substr('abcde',3,2) from lxw_dual;

cd

hive> select substring('abcde',3,2) from lxw_dual;

cd

hive>select substring('abcde',-2,2) from lxw_dual;

de

7 字符串转大写函数:upper,ucase

语法: upper(string A) ucase(string A)

返回值: string

说明:返回字符串A的大写格式

举例:

hive> select upper('abSEd') from lxw_dual;

ABSED

hive> select ucase('abSEd') from lxw_dual;

ABSED

8 字符串转小写函数:lower,lcase

语法: lower(string A) lcase(string A)

返回值: string

说明:返回字符串A的小写格式

举例:

hive> select lower('abSEd') from lxw_dual;

absed

hive> select lcase('abSEd') from lxw_dual;

absed

9 去空格函数:trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:

hive> select trim(' abc ') from lxw_dual;

abc

10 左边去空格函数:ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:

hive> select ltrim(' abc ') from lxw_dual;

abc

11 右边去空格函数:rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:

hive> select rtrim(' abc ') from lxw_dual;

abc

12 正则表达式替换函数:regexp_replace

语法: regexp_replace(string A, string B, string C)

返回值: string

说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

举例:

hive> select regexp_replace('foobar', 'oo|ar', '') from lxw_dual;

fb

13 正则表达式解析函数:regexp_extract

语法: regexp_extract(string subject, string pattern, int index)

返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

举例:

hive> select regexp_extract('foothebar', 'foo()(bar)', 1) fromlxw_dual;

the

hive> select regexp_extract('foothebar', 'foo()(bar)', 2) fromlxw_dual;

bar

hive> select regexp_extract('foothebar', 'foo()(bar)', 0) fromlxw_dual;

foothebar

注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。

select data_field,

regexp_extract(data_field,'bgStart\\=([^&]+)',1) as aaa,

regexp_extract(data_field,'contentLoaded_headStart\\=([^&]+)',1) as bbb,

regexp_extract(data_field,'AppLoad2Req\\=([^&]+)',1) as ccc

from pt_nginx_loginlog_st

where pt = '2012-03-26'limit 2;

14 URL解析函数:parse_url

语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

返回值: string

说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO

举例:

hive> selectparse_url('>

#hive相关资料

#>

目标:

1、掌握hive基础语法、常用函数及其组合使用

2、掌握一些基本业务指标的分析思路与实现技巧

1)某次经营活动中,商家发起了“异性拼团购”,试着针对某个地区的用户进行推广,找出匹配用户。

注意:如果该表是一个分区表,则where条件中必须对分区字段进行限制

2)选出在2018年12月31日,购买的商品品类是food的用户名、购买数量、支付金额

3)试着对本公司2019年第一季度商品的热度与价值度进行分析。

"2019年一月到三月,每个品类有多少人购买,累计金额是多少"

GROUP BY HAVING(分类汇总过滤)

4)找出在2019年4月支付金额超过5万元的用户,给这些VIP用户赠送优惠券

5)2019年4月,支付金额最多的TOP5用户

查看Hive中的函数:show functions;

查看具体函数的用法:1)desc function 函数名;2)desc function extended函数名;

6)

7)用户的首次激活时间,与2019年5月1日的日期间隔。

datediff(string enddate,string startdate):结束日期减去开始日期的天数

拓展:日期增加函数(增加天数)、减少函数(减少天数) —— date_add、date_sub(类型要是string类型的)

date_add(string startdate,int days)、date_sub(string startdate,int days)

case when 函数

8)统计以下四个年龄段20岁以下、20-30岁、30-40岁、40岁以上的用户数

case when 的时候不用加group by,只有在聚合函数的时候才需要group by

if 函数

9)统计每个性别的用户等级高低分布情况(假设level大于5为高级,注意列名不能使用中文的)

10)分析每个月都拉新情况

substring(stringA,INT start,int len),substr(stringA,INT start,int len),截取起始位置和截取长度

extra1需要解析json字段,然后用$key取出想要获取的value;

extra2使用的是中括号加引号的方式进行字段提取和分组;

两种写法要看字段类型的不同采取不同的方式

11)求不同手机品牌的用户数

12)ELLA用户的2018年的平均每次支付金额,以及2018年最大的支付日期和最小的支付日期的间隔

13)2018年购买的商品品类在两个以上的用户数

步骤总结:

1、先求出每个人购买的商品品类书

2、筛选出购买商品品类书大于2的用户

3、统计符合条件的用户有多少个

14)用户激活时间在2018年,年龄段在20-30岁和30-40岁的婚姻情况分布

步骤总结:

1、先选出激活时间在2018年的用户,并把他们所在的年龄段计算好,并提取出婚姻状况;

如何select后面没有进行聚合,则可以不用使用group by,直接使用where进行过滤就可以;

2、取出年龄段在20-30岁和30-40岁的用户,把他们的婚姻状况转义成可理解的说明;

3、聚合计算,针对年龄段,婚姻状况的聚合

    这一周主要学习了 Hive 的一些基础知识,学习了多个 Hive 窗口函数,虽然感觉这些窗口函数没有实际的应用意义,但还是都了解了一下。

:可以实现在窗口中实现逐行累加

其他 avg、count、min、max 的用法一样

#要先有一个统计出每个月总额的表,这里就是 t_access_amount 表,如下图一

# partition by uid:根据uid 分组,order by month :根据月份排序,

rows between unbounded preceding and current_row:选择 无边界的前面的行和当前行之间的行,最后是求 sum 即和。得到下图二

# 是在窗口求和,而窗口的定义时按照 uid 分区 order by 排序得到的。得到一个字段

preceding:前面的,后来的,往序号变大的方向

following:往后

2 preceding :表示前2行

3 following :表示后3行

unbounded preceding:表示从第1行开始,从前面的起点

unbounded following:表示最后一行,从后面的终点

注意:使用 rows between 时,按order by 顺序编号(没有指定order by 会默认排序)需要左边是我号右边是大编号

注意:上面显示的排序结果不太对,所以看起来好像结果是相反的一样,实际上单独拿出来运行是对的,可以看以相同方式排序的 rn 编号。

注意:这上面这些都不支持使用 rows between 语句,row_number() 展示出来的排序会和查询字段的最后一个 over(order by)里面的顺序一样

:分组 TOPN,即可以分组后排序,便于找到最好的几条数据

eg:有如下数据,要查出每种性别中年龄最大的2条数据

1,18,a,male

2,19,b,male

3,22,c,female

4,16,d,female

5,30,e,male

6,26,f,female

分析:如果使用按性别分组,是可以分出两条数据,但是分组的缺点是只能查出聚合函数(聚合函数只能产生一组中的一个值)和分组依据。而这里是要求多条数据(2个)

:用于将分组数据按照顺序切分成 n 片(不一定是平均),然后每一份都编号为1-n,这样就可以拿到想要那一份数据。如果切片不均匀,默认增加第一个切片的分布,例如,14 条记录切3片就切不好,就会切成 6、4、4,其中6那份编号为1。

注意:可以不指定 order by

应用:

    统计各个 cookieid,pv 数最多的前1/3天的数据

:生成数据项再分组中的排名,排名相等会在名次中留下空位

:生成数据项再分组中的排名,排名相等不会再名次中留下空位

注意:上面两者都需要指定 order by,不然排名都是1

根据上图,可知区别:

    rank():按顺序编号,相同分组排序有相同的排名,但是会占位,后面的排名隔一位,就是成绩一样名次相同,但是后面的名次得低两位。

    dense_rank():按顺序编号,相同分组排序有相同的排名,后面排名顺序不边就是有并列第几名的情况。

    row_number() :按顺序编号,不会有相同的编号,即使分组排序是相同的。

:小于等于当前值的行数/分组内总行数,注意这个要指定排序方式,不然全都是1

:分组内当前行的(rank 值-1)/(分组内总行数-1)

总结:排序、切片、编号、的都需要使用 order by,不然会全都是1,但是除了 row_number() 因为这个函数编号不重复且顺延,所以还是会有编号,但是不确定编号逻辑。

:用于获得窗口内往上第n行的值,n>=0

第一个参数为列名

第二个参数为往上第n行(可选,默认为1)

第三个参数为默认值(当往上第n行为NULL时,取默认值,如不指定,则为NULL)

:与lag 相反,用于获取窗口内往下第n 行的值,n>=0

第一个参数为列名

第二个参数为往上第n行(可选,默认为1)

第三个参数为默认值(当往上第n行为NULL时,取默认值,如不指定,则为NULL)

:取分组内排序后,截止到当前行,最后一个值

:取分组内排序后,第一个值

注意:使用窗口分析函数时,要特别注意 order by 的使用,如果使用的不恰当会导致统计的不是我们想要的。 row_number() over() 的展示排序好像时根据最后一个字段的over(order by)来展示的 。

这几个分析函数通常用于 olap 中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如分 时、分、天、月的 UV 数

:表示结果属于哪一个分组集合,注意中间是两个下划线

第一列时按照 month 进行分组的,

第二列时按照 day 进行分组的

第三列时按照 对应month、day 分组统计出来的结果

第四列 grouping__id 表示这一组结果属于哪个分组集合

注意:grouping sets 里面就是说明以什么分组,上面的group by 是指定可以进行组合的分组字段sets 里面的只能使用这里指定的字段,

如,这里 grouping sets(month , day) 表示分别根据 month、day 字段分组,               grouping sets(month,day,(month,day)) 则表示分别根据 month、day、month和day 分组。  

这里group by 和 grouping sets 可以搭配使用,不是这里的专属,并且这里也可以不用 groupind sets

:根据group by 的维度的所有组合进行聚合,就是省略 grouping sets ,直接将group by 后面的字段以各种可能的形式分组,然后union all 得到结果。

等价于下面的语句

:是 cube 的子集,以最左侧的维度为主,从该维度进行层级聚合

上面可以实现一个叫上钻的效果:

    月天的uv==》月的uv==》总的uv

select orderid,fenjian,timee

from

(

select orderid,fenjian,timee,row_number(orderid,fenjian) rn

from (

select orderid,fenjian,timee from tableName

distribute by orderid,fenjian sort by orderid,fenjian,timee asc

) t1

) t2

where t2rn=1

以上就是关于Hive实战项目——影音网站数据分析全部的内容,包括:Hive实战项目——影音网站数据分析、hive使用教程(2)--数据导入导出、查询与排序、hive怎么将字符型转为数值型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9686160.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存