小姐姐,工作中窗口用的那么溜,毕竟我也是一个爱好学习的人,怎么也得研究一把,说干咱就干
准备数据
1、 创建库:create database if not exists bicoredata;
2、 查看库:show databases;
3、 切换数据库:use bicoredata;
4、 建表
CREATE EXTERNAL TABLE IF NOT EXISTS bicoredata.dwd_user_page_view_dm(
user_id VARCHAR(32) COMMENT ‘用户ID’
,pv INT COMMENT ‘访问量’
)COMMENT ‘用户日浏览量访问记录表’
PARTITIONED BY (pt_d varchar(8) COMMENT ‘时间’)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
STORED AS INPUTFORMAT ‘org.apache.hadoop.mapred.TextInputFormat’
OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’
LOCATION ‘hdfs://centos01:9000/user/hive/warehouse/dwd_user_page_view_dm’
TBLPROPERTIES (‘transient_lastDdlTime’=‘1591541459’);
4.插入数据
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO bicoredata.dwd_user_page_view_dm PARTITION(pt_d)(user_id,pv,pt_d) VALUES
(‘83AD10183789E78D4’, 1, ‘2020107110’),
(‘83AD10183789E78D4’, 5, ‘2020105111’),
(‘83AD10183789E78D4’, 7, ‘2020103112’),
(‘83AD10183789E78D4’, 3, ‘2020104113’),
(‘83AD10183789E78D4’, 2, ‘2020102114’),
(‘83AD10183789E78D4’, 4, ‘2020101115’),
(‘83AD10183789E78D4’, 4, ‘2020106116’),
(‘15AE1A14B85921889’, 2, ‘2020103110’),
(‘15AE1A14B85921889’, 9, ‘2020106111’),
(‘15AE1A14B85921889’, 3, ‘2020108112’),
(‘15AE1A14B85921889’, 10,‘2020102113’),
(‘15AE1A14B85921889’, 12,‘2020105114’),
(‘15AE1A14B85921889’, 183,‘2020109115’),
(‘15AE1A14B85921889’, 322,‘2020111116’),
(‘0006D2BC14DF914C0’, 35, ‘2020104110’),
(‘0006D2BC14DF914C0’, 25, ‘2020106111’),
(‘0006D2BC14DF914C0’, 12, ‘2020104112’),
(‘0006D2BC14DF914C0’, 33, ‘2020103113’),
(‘0006D2BC14DF914C0’, 62, ‘2020101114’),
(‘0006D2BC14DF914C0’, 94, ‘2020107115’),
(‘993BD7AD13B621BA0’, 44, ‘2020108116’),
(‘993BD7AD13B621BA0’, 26, ‘2020109110’),
(‘993BD7AD13B621BA0’, 98, ‘2020110111’),
(‘993BD7AD13B621BA0’, 31, ‘2020112112’),
(‘993BD7AD13B621BA0’, 10, ‘2020104113’),
(‘993BD7AD13B621BA0’, 13, ‘2020104114’),
(‘993BD7AD13B621BA0’, 8, ‘2020102115’);终于建完表了,进入正题
到了发现没有字段头,我们为了看更好的字段效果需要将字段头打印出来
set hive.cli.print.header=true;
lead()的函数
执行如下sql语句:
SELECT
user_id
,pt_d
,pv
,LEAD(pv, 1, 0) OVER (PARTITION BY user_id ORDER BY pt_d) AS pre_pv
FROM bicoredata.dwd_user_page_view_dm;
效果如下:
这里我们发现数据按照user_id分组,按照pt_d排序,取得pv的值是向下错位了一个(LEAD(pv, 1, 0)),每个分组的最后一个没法错位,用0填充图中标红显示。
LAG()的函数
执行如下sql语句:
SELECT
user_id
,pt_d
,pv
,LAG(pv, 1, 0) OVER (PARTITION BY user_id ORDER BY pt_d) AS _pv
FROM bicoredata.dwd_user_page_view_dm;
效果如下:
这里我们发现数据按照user_id分组,按照pt_d排序,取得pv的值是(LAG(pv, 1, 0))舍弃最后一个用0填充图中黄色显示。每组第一个值是默认值0,从第二个值开始用pv升序填充。
FIRST_VALUE()的函数
执行如下sql语句:
SELECT
user_id
,pt_d
,pv
,FIRST_VALUE(pv) OVER (PARTITION BY user_id ORDER BY pt_d) AS top_pv
FROM bicoredata.dwd_user_page_view_dm;
效果如下:
我的理解FIRST_VALUE(pv) 是取得每组的头牌花魁
LAST_VALUE() 函数
执行如下sql语句:
SELECT
user_id
,pt_d
,pv
,LAST_VALUE(pv) OVER (PARTITION BY user_id ORDER BY pt_d) AS e_pv
FROM bicoredata.dwd_user_page_view_dm;
效果如下:
我在跑hive中遇first——values到这个错:
Caused by: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: attempt to setup a Window for datatype VARCHAR