1、已知用户(uid)登录时间(login_time)、登出时间(logout_time),求指定数据中用户最大在线数。
with tmp_zlj_test_001 as (
select
213142 as uid,
'2019-01-01 12:21:22' as login_time,
'2019-01-01 13:45:21' as logout_time
union all
select
412321 as uid,
'2019-01-01 13:35:11' as login_time,
'2019-01-01 16:01:49' as logout_time
union all
select
412322 as uid,
'2019-01-01 13:36:11' as login_time,
'2019-01-01 16:02:49' as logout_time
)
select
max(num) `最大登录人数`
from
(
select
sum(index1) over(order by cnt_time) as num
from
(
select
uid,
unix_timestamp(login_time) as cnt_time,
1 index1
from tmp_zlj_test_001
union all
select
uid,
unix_timestamp(logout_time) as cnt_time,
-1 index1
from tmp_zlj_test_001
) aa
) bb
如上,准备3人登录记录数据,取登录的记录为1,登出的记录为-1,再通过sum(index1) over(order by cnt_time)按升序累加,取最大值即为数据中用户最大在线数。
开窗函数参考:sum(x) over( partition by y ORDER BY z ) 分析_xxc1605629895的博客-优快云博客
2、Java中序列化有哪几种方式?static和transient有什么区别?它们可以被序列化吗?
参考内容:序列化有哪几种方式?static和transient有什么区别?它们可以被序列化吗?_灵洛的人间乐园的博客-优快云博客_static能被序列化吗
3、Hive中排序有多少种?区别是什么?
hive中的几种排序的区别_Samaritan_H的博客-优快云博客_hive几个排序的区别
4、同比环比统计方法?
同比和环比的区别在于:
第一个,同比是把不连续的两期数据进行对比;环比是把两期连续的数据进行对比。例如:同比:比如2022年3月和2021年3月数据相比叫同比;环比:比如2022年3月和2022年2月数据相比叫环比。
第二个,计算方式。
同比增长率=(本期数-同期数)÷同期数×100%。
环比增长率=(本期数-上期数)÷上期数×100%。
第三个,同比更侧重的是反映数据长期的大趋势。环比则是突出显示数据的短期变化趋势。
参考链接:Hive实现同比环比计算_一个写湿的程序猿的博客-优快云博客_hive计算环比
5、活动销售天数统计
思路分析:
关键点:lag() over (partitioned by ...order by ...)开窗函数的用法
1. 用开窗函数lag(), 增加col_date字段, 取得向前偏移1个单位的结束日期(上一个营销活动的结束日期)
2. case when进行条件筛选:
2.1 如果col_date为空, 说明当前营销活动为该品牌的首次活动, 直接计算enddate - startdate +1 即可
2.2 如果当前营销活动开始时间(end_date)小于等于上一个营销活动的结束日期(col_date), 则用end_date减去col_date(不加1, col_date重复)
2.3 其他情况(else): enddate - startdate +1
3. 对步骤2结果集group by brand, 在sum(营销天数)即为所求
参考链接:SQL:统计不同品牌的营销天数_大数据小陈的博客-优快云博客
6、解决hbase热点问题
所谓数据热点, 指的是大量的数据写到hbase的某一个或者某几个region中, 导致其余的region没有数据, 其他region对应regionServer的节点承受了大量的并发请求, 此时就出现了热点问题
解决方案: 通过预分区和设计良好的rowkey来解决
--加盐处理(加随机数) : 可以在rowkey前面动态添加一些随机数, 从而保证数据可以均匀落在不同region中
基本保证数据落在不同region
将相关性比较强的数据分散在不同的额region中, 导致查询的效率有一定降低
--hash处理: 根据rowkey计算其hash值, 在rowkey前面hash计算值即可 (MD5 HASH)
让相关性比较强的数据可以被放置到同一个region中
如果相关数据比较多, 依然会导致热点问题
--反转策略: 比如说手机号反转 或者 时间戳的反转
好处: 基本保证数据落在不同region
弊端: 将相关性比较强的数据分散在不同的region中, 导致查询的效率有一定降低
7、谓词下推
参考文档:谓词下推_迷路剑客的博客-优快云博客_谓词下推
8、cache()和persist()有什么区别?
首先cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间。
区别:cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
9、map和mapPartition的区别?
1. map():每次处理一条数据。
2. mapPartition():每次处理一个分区的数据,这个分区的数据处理完后,原RDD中分区的数据才能释放,可能导致OOM。
3. 开发指导:当内存空间较大的时候建议使用mapPartition(),以提高处理效率。
10、时间复杂度和空间复杂度?
暂时不会算