Hive和Hbase对比
Hive和Hbase对比

Hive应用场景
-
数据分析:Hive可以用于处理大规模结构化数据集,例如Web日志、交易记录和社交媒体数据等。它可以帮助企业和组织快速分析大量数据,以获取有价值的洞察。
-
数据仓库:Hive可以用于构建大型数据仓库,以存储和管理大量结构化数据。
-
ETL:Hive可以用于执行数据抽取、转换和加载(ETL)任务,以帮助将数据从不同的数据源中汇总、清理和转换。
HBase应用场景
-
实时数据存储:HBase可以用于存储实时数据,例如用户行为数据、传感器数据和日志数据等。它可以快速地处理大量数据,以支持实时数据分析和决策。
-
网络安全:HBase可以用于存储网络安全数据,例如网络流量数据和日志数据等。它可以帮助企业和组织实时监控和分析网络安全事件,并采取适当的措施来保护网络安全。
-
物联网(IoT):HBase可以用于物联网(IoT)应用场景。物联网中的设备可以生成大量的实时数据,例如传感器数据、设备状态数据和环境数据等。HBase可以存储这些非结构化和半结构化数据,并快速处理和查询这些数据,以支持实时决策和应用程序。例如,一个智能城市的物联网应用程序可以使用HBase来存储传感器数据,并使用实时数据分析来优化交通流量、节省能源和提高城市安全性。
区别
尽管Hive和HBase都是基于Hadoop的技术,但它们的设计目标和用例是不同的。下面是Hive和HBase之间的主要区别:
-
数据模型:Hive使用类似于关系型数据库的表格模型来存储数据,而HBase使用分层映射表格模型来存储非结构化和半结构化数据。
-
查询语言:Hive使用SQL查询语言,而HBase使用基于Java的API来查询数据。
-
数据访问方式:Hive使用MapReduce作业或Tez任务来访问数据,而HBase使用HBase客户端API来访问数据。
-
数据存储方式:Hive将数据存储在HDFS上,而HBase将数据存储在HDFS上的HBase区域服务器集群中。
-
应用场景:Hive适用于处理结构化数据,例如日志文件和传统关系型数据。而HBase适用于存储非结构化数据,例如传感器数据、日志数据和用户行为数据等。
HiveSQL练手题
HiveSQL 连续登录7天
解法1
-- 大体思路是取到每一条对应的前面第7条的日期,相减后如果为6,则表明该条已经连续7天登录。然后在进行去重即可得到连续登录7天以上的用户
select
distinct id
from
(
select
id
, dte
, lag(dte, 6, null) over(partition by id order by dte) as lag_dte
from tbl t
) t
where datediff(dte, lag_dte) = 6
-- 方法一思路:
-- 1、因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重。
--
-- 2、再用row_number() over(partition by _ order by _)函数将用户id分组,按照登陆时间进行排序。
--
-- 3、计算登录日期减去第二步骤得到的结果值,用户连续登陆情况下,每次相减的结果都相同。
--
-- 4、按照id和日期分组并求和,筛选大于等于7的即为连续7天登陆的用户。
--
-- 方法一
-- 第一步:用户登录日期去重
select distinct date(date) as 日期,id from tb_user;
-- 第二步:用row_number()计数
select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a;
-- 第三步:日期减去计数值得到结果
select *,date(日期)-cum as 结果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a)b;
-- 第四步:根据id和结果分组并计算总和,大于等于7的即为连续登录7天的用户
select id,count(*) from (select *,date(日期)-cum as 结果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a)b)c GROUP BY id,结果 having count(*)>=7;
select * from tb_user;
-- 方法二
select id,count(date2) as 连续天数
from (select *,date_sub(date1,interval r day) date2
from(select distinct id,date(date) date1,
dense_rank()over(partition by id ORDER BY date(date)) as r
from tb_user) v ) w
group by id,date2
having count(date2) >= 7;
-- 方法三
select id,max(h) '登录天数'from(
select id ,count(e) h from (
select *,a-b as e from (
select *,row_number() over(order by id) b from(
select *,date_format(date,'%Y%m%d') a from (
select distinct id,date(date) date from tb_user order by id,date(date)) as c
)as d) as f)as g
group by e,id)as i group by id having max(h) >= 7;
-- 方法五
select id,max(sort1) as 最多登录天数
from(
select *,
dense_rank()over(partition by id,datesub order by id,date) as sort1
from
(select *,
date_sub(date,interval sort day) as datesub
from
(select id,date(date) date,
dense_rank()over(partition by id order by id,date(date)) as sort
from tb_user) a # 按id,date 不跳越排序
) b #计算 date - sort 日期差
) c group by id having max(sort1) >= 7; #再次排序 按id和 日期差
-- 方法六
SELECT id,count(date-t2) `连续登录天数`
from(SELECT DISTINCT date(date) date,id,row_number()over(PARTITION by id)t2
from tb_user GROUP BY id,date(date)) a
group by id,date-t2 having count(date-t2) >= 7;
-- 方法七
-- 排序+去重
select distinct id,date(date) date from tb_user order by id,date(date);
-- 给上表中添加row_number num 和 日期-num n
select id,date,row_number()over(partition by id) num,day(date) - row_number()over(partition by id) n from (select distinct id,date(date) date from tb_user order by id,date(date)) a;
-- 相同id且相同n的记录数超过7即可
select id,count(n) from (select id,date,row_number()over(partition by id) num,day(date)-row_number()over(partition by id) n from (select distinct id,date(date) date from tb_user order by id,date(date)) a) a group by id,n having count(n) >= 7;
-- 方法八
select distinct a.id
from (select distinct id,day(date) day1,dense_rank()over(partition by id order by day(date)) dayno from tb_user) a
join (select distinct id,day(date) day1,dense_rank()over(partition by id order by day(date)) dayno from tb_user) b
on a.id = b.id
where a.day1 + 6 = b.day1 and a.dayno + 6 = b.dayno
group by a.id,a.day1;
select
user_number
from
(
select
user_number,
dt,
row_number() over(partition by user_number order by event_time desc ) as rank
from user_active_log
where dt >'20210417' and dt<='20210517'
)tmp
group by user_number,cast(dt as int)+rank having count(1)>=7
参考
https://baijiahao.baidu.com/s?id=1685411745554429414&wfr=spider&for=pc
https://blog.csdn.net/weixin_46780832/article/details/129420638
https://blog.csdn.net/m0_60487995/article/details/124208006

浙公网安备 33010602011771号