Flink CDC(Change Data Capture)的优势在于其全增量一体化的流处理架构。它基于Flink引擎,不仅能实时捕获数据库的增量变更日志(如MySQL的binlog),还能一次性完成历史数据的全量快照读取,并在全量同步完成后无缝切换到增量模式,整个过程无需中断,保证数据一致性-。这使其成为构建实时数据湖、实时数仓和需要低延迟响应的数据管道的理想选择-1。
问:GBDT、XGBoost、LightGBM的区别?工业界为什么首选LightGBM? 答:① 区别:GBDT串行迭代、只用一阶导数、无正则;XGBoost加入一二阶导数、L1/L2正则、并行建树、处理缺失值;LightGBM用直方图优化、Leaf-wise生长、内存占用低、速度最快,原生支持分布式。 ② 工业界首选LightGBM:训练速度快、内存占用低、精度高、自带正则防过拟合、支持类别特征、原生分布式,适配千万级以上海量数据,适合业务落地(如风控、推荐、流失预测)。
问:过拟合和欠拟合的原因及解决办法? 答:① 过拟合:模型复杂度过高、样本量不足、噪声过多、特征冗余; 解决:增加训练数据、正则化(L1/L2、Dropout)、树模型剪枝(限制深度、叶子节点数)、早停(监控验证集精度,停止过拟合)、特征筛选(剔除冗余特征)。 ② 欠拟合:模型复杂度过低、特征不足、训练不充分; 解决:增加特征(衍生特征、交叉特征)、提升模型复杂度(如用树模型替代线性模型)、减少正则化、增加训练迭代次数。
问:分类和回归的区别?常用的评估指标有哪些? 答:① 区别:分类输出离散标签(如0/1、多类别),回归输出连续值(如房价、销量); ② 分类指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1值、AUC(衡量模型排序能力,不受样本不均衡影响)、混淆矩阵; ③ 回归指标:MAE(平均绝对误差,抗异常值)、MSE(均方误差,惩罚大误差)、RMSE(均方根误差,与目标值同量纲)、R²(拟合优度,越接近1越好)。
问:样本不均衡怎么处理?(高频,如风控、异常检测场景) 答:① 数据层面:过采样(SMOTE、ADASYN,增加少数类样本)、欠采样(减少多数类样本,避免信息丢失)、合成样本(生成虚拟少数类样本); ② 模型层面:调整类别权重(如LightGBM的class_weight)、采用合适的损失函数(如Focal Loss,降低多数类样本权重); ③ 评估层面:不用准确率,重点看少数类的召回率、F1值、AUC。
-- 优化:加盐打散 SELECT * FROM table WHERE IF(city IS NULL, CONCAT('rand_', RAND()), city) = IF(city IS NULL, CONCAT('rand_', RAND()), city);
2. Key 热点倾斜 加盐两阶段聚合
1 2 3 4 5 6 7 8 9
-- 第一层:局部聚合加盐 SELECT key, CONCAT(key,'_',CAST(RAND()*10 AS INT)) AS salt_key, COUNT(1) AS cnt FROM log GROUP BY key, CONCAT(key,'_',CAST(RAND()*10 AS INT));
-- 第二层:去掉盐全局聚合 SELECT REPLACE(salt_key,'_',SUBSTRING_INDEX(salt_key,'_',-1)) AS key, SUM(cnt) FROM tmp GROUP BY REPLACE(salt_key,'_',SUBSTRING_INDEX(salt_key,'_',-1));
3. Join 倾斜优化
小表广播 Join:/*+ BROADCAST(small_table) */
大表倾斜 Key 单独处理,其余正常 Join,再 Union
1 2 3 4
SELECT /*+ BROADCAST(b) */ a.* FROM big_table a JOIN small_table b ON a.key = b.key;
四、经典业务 SQL 真题
1. 连续登录天数(超高频)
思路:日期减去行号,相同即为连续
1 2 3 4 5 6 7 8 9 10 11
# 连续登陆超过3天 SELECT user_id, MIN(dt), MAX(dt), COUNT(1) AS continue_days FROM ( SELECT user_id, dt, DATE_SUB(dt, ROW_NUMBER() OVER(PARTITIONBY user_id ORDERBY dt)) AS flag FROM login_log ) t GROUPBY user_id, flag HAVINGCOUNT(1) >= 3;
# 次日留存 select today.dt, count(distinct today.user_id) as new_user, count(distinct tomorrow.user_id) as retain_1d from ( select dt,user_id from user_new ) today leftjoin ( select dt,user_id from user_active ) tomorrow on today.user_id = tomorrow.user_id and tomorrow.dt = date_add(today.dt,1) groupby today.dt;
# 一段时间内的留存,7天为例
3. 漏斗转化分析(电商、金融必问)
业务:浏览-加购-下单-支付,每一步转化率。
解题思想:同一用户行为路径、判断是否走完下一个节点。
1 2 3 4 5 6
select sum(if(step=1,1,0)) as view_cnt, sum(if(step=2,1,0)) as cart_cnt, sum(if(step=3,1,0)) as order_cnt, sum(if(step=4,1,0)) as pay_cnt from user_funnel;