钜形不锈钢水箱 发表于 7 天前

大数据之经典面试题(2)

8.什么是拉链表以及常见的利用方式?

拉链表就是一种即维护历史状态,又存储了最新状态数据的表,拉链表根据拉链粒度的不同,实际上相当于我们对假造机进行快照,对它进行了优化,去除了一部分稳定的记录。拉链表即反映了历史变革。
先修改再插入
先删除再插入
覆盖插入
常见利用的方式是覆盖插入 即保存了历史数据,又新增了新的数据,下面是sql实现覆盖插入的方法:
-- 需求:将增量数据插入拉链表,并修改拉链表历史数据的时间数据
-- 将新增和变化后的数据存入临时表 T,把开始日期置为当前日期(dt),结束日期置为最大日期
with t as(
select order_id,
goods_price,
status,
dt as start_date,
'9999-12-31' as end_date
from test.order_increment
where dt='2023-12-03'
),

-- 将历史数据表中变化前和未变化的数据(历史数据表 LEFT JOIN T)存入临时表 H,
-- 并且要把变化前的数据的结束日期修改为当前日期(dt),即闭链
h as (
select
a.order_id,
a.goods_price,
a.status,
a.start_date
if(a.end_date='9999-12-31' and t.order_id is not null,t.start_date.a.end_date)as end_date
from test.order_zip as a
left join t ;

-- 将新增和变化后的数据以及变化前和未变化的数据覆盖插入历史数据表中(T UNION ALL H),即开链
INSERT OVERWRITE TABLE test.order_zip
SELECT * FROM h
UNION ALL
SELECT * FROM t;
-- 查询验证
SELECT * FROM test.order_zip ORDER BY order_id; 从每天数据增量表中根据 dt 字段获取当天数据(新增和变革后的数据);
将上一步查询的效果存入暂时表 T,把开始日期置为当前日期(dt),竣事日期置为最大日期;
将历史数据表中变革前和未变革的数据(历史数据表 LEFT JOIN T)存入暂时表 H,而且要把变革前的数据的竣事日期修改为当前日期(dt),即闭链;
将新增和变革后的数据(暂时表 T)以及变革前和未变革的数据(暂时表 H)覆盖插入(INSERT OVERWRITE TABLE) 历史数据表中(H UNION ALL T),即开链。
拉链表不是只能应用于维度表,事实表同样可以应用拉链表
9.活跃、留存、流失、回流分别代表什么意思?

活跃:在特定时间段,用户进行某些订定的操作,如登录、浏览页面、下单等,外貌用户处于活跃状态。
留存:在某个特定的时间点之前注册或开始利用产品的用户,在之后的特定时间内仍旧利用产品的比例。
流失:指用户在一段时间内不再利用产品或服务,通常以你多长时间未进行任何操作来定义,如连续60天未登录则视为流失用户。
回流:曾经流失的用户,在之后的某个时间又重新开始利用产品或服务。例如:王者荣耀的回归玩家。
10.Flume 支持的 Channel 类型及特点

Memory Channel :Event数据存储在内存中
JDBC Channel :将事件存储在关系型数据库中,性能低、不会因体系奔溃或重启而丢失
File Channel:利用文件作为数据的存储
Spillable Memory Channel:数据存储在内存中,当内存队列满时,数据会长期化到磁盘文件中
11.在实际生产过程中维度建模怎么做?

在我们的业务体系中,对于维度建模计划采取四步计划方法:
选择业务过程、声明粒度、确定维度、确定事实
业务过程可以概况为一个个不可拆分的行为事件,一个业务过程对应一张事物事实表
业务过程确定后,需要为每个业务过程声明粒度
确定与每张事物事实表相关的维度
确定每个业务过程的度量值
12.为什么不能简朴SUM已经COUNT DISTINCT的效果?

让我用一个具体的例子来解释这个问题,这样会更清晰。
实际数据示例

假设原始数据中有以下用户访问记录:
provincedeviceTypeisNewguid湖南省MI51userA湖南省MI50userA湖南省MI51userB湖南省MI60userC 第一次聚合(按三个维度)

SELECT
province,
deviceType,
isNew,
 COUNT(DISTINCT guid) AS uv_cnt
FROM test.test_traffic_detail
GROUP BY province, deviceType, isNew 效果:
provincedeviceTypeisNewuv_cnt湖南省MI512(userA和userB)湖南省MI501(userA)湖南省MI601(userC) 问题:第二次错误聚合

SELECT
province,
deviceType,
 SUM(uv_cnt) AS uv_cnt
FROM ads_base_cube
GROUP BY province, deviceType 错误效果:
provincedeviceTypeuv_cnt湖南省MI53(2+1) ← 错误!userA被重复计算湖南省MI61 正确效果应该是多少?

如果直接按两个维度计算:
SELECT
province,
deviceType,
 COUNT(DISTINCT guid) AS uv_cnt
FROM test.test_traffic_detail
GROUP BY province, deviceType 正确效果:
provincedeviceTypeuv_cnt湖南省MI52(userA和userB)湖南省MI61(userC) 关键问题说明


[*] userA被重复计数:

[*] 第一次聚适时,userA出现在isNew=1和isNew=0两个组
[*] 每个组都独立计算uv_cnt,以是userA被两个组各计1次
[*] 简朴SUM会把这两个1相加,导致userA被计为2次

[*] COUNT DISTINCT的性子:

[*] 只能在原始数据上正确工作
[*] 对已经COUNT DISTINCT的效果再次SUM,会破坏去重逻辑

类比解释

想象一个班级:


[*] 男生中有3个学生到场过比赛
[*] 女生中有2个学生到场过比赛
[*] 但有1个学生既是男生又是女生(跨性别)
如果简朴相加:3(男) + 2(女) = 5,但实际上只有4个不同砚生(因为1人被重复计算)
这就是为什么不能简朴SUM已经COUNT DISTINCT的效果。












免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 大数据之经典面试题(2)