一、Linux
1. 查看服务器内存占用最高进程
bash
free -h && top -o %MEM -n 1 | head -15
free -h:人性化单位显示内存,查看整机内存剩余,判断是否内存溢出
&&:前一条命令执行完再执行下一条
top:Linux 系统进程监控工具
-o %MEM:固定按照内存使用率降序排列
-n 1:只输出 1 次数据,不实时滚动刷屏,适合脚本采集、快速排查
head -15:只展示前 15 个高内存进程
生产实战场景Spark 任务、YARN 任务卡顿、报错 OOM 内存溢出,第一时间执行此命令,杀掉占用内存过高无用进程,释放集群资源
2. HDFS 本地文件上传至集群指定路径
bash
hdfs dfs -put /data/test.csv /user/hive/ods/
hdfs dfs:操作 HDFS 文件系统固定前缀
-put:上传文件指令
前面路径:Linux 服务器本地文件路径
后面路径:HDFS 集群存储路径
追加 -f:hdfs dfs -put -f 强制覆盖已存在同名文件
业务用途日常把业务日志、离线 CSV 数据上传 HDFS,接入数仓 ODS 层,是大数据入仓最基础命令
3. 定时任务查看与删除定时脚本
bash
crontab -l
crontab -e
crontab -l:列出当前 Linux 登录账号所有定时任务
crontab -e:进入编辑定时任务界面,编写离线调度脚本
大数据常用定时每天凌晨 2 点执行 Hive 数仓清洗脚本、凌晨 5 点合并 Hive 小文件、早 8 点生成日报表,全都依靠 crontab
实战用途:集群资源监控、数仓数据上传、离线任务定时配置,日常 ETL 必备
二、SQL
通用表结构
1.dwd_user_active 用户日活跃表:user_id(用户ID),dt(日期)
2.dwd_order_info 订单明细表:order_id,create_time下单时间,refund_status退款状态 1退款 0正常
3.dwd_user_visit 用户访问表:channel渠道,user_id,device_id设备号,dt日期
1. 统计用户连续 7 天活跃用户
sql
SELECT user_id
FROM(
SELECT user_id,dt,
date_add(dt,-row_number() over(partition by user_id order by dt)) gid
FROM dwd_user_active
)t
GROUP BY user_id,gid
HAVING COUNT(*)>=7;
partition by user_id order by dt
按用户分组,日期从小到大排序,给每个用户活跃日期生成自增序号
date_add(dt, -序号)
日期减去排序序号,连续日期计算结果相同,断签日期结果不同
别名gid作为连续分组标识
外层按照user_id+gid分组统计天数
having count(*)>=7 筛选出连续活跃满 7 天用户
业务场景电商连续签到用户、平台高留存用户、活动奖励用户筛选
2. 统计各月份订单量、退款订单量、退款率
sql
SELECT
date_format(create_time,'yyyy-MM') month,
COUNT(order_id) all_order,
SUM(if(refund_status=1,1,0)) refund_order,
ROUND(SUM(if(refund_status=1,1,0))/COUNT(*),3) refund_rate
FROM dwd_order_info
GROUP BY date_format(create_time,'yyyy-MM');
date_format(时间,'yyyy-MM') 把日期统一聚合为年月,做月度报表
COUNT(order_id) 统计当月全部订单数量
IF(refund_status=1,1,0) 退款订单标记为 1,其余 0,SUM 求和得到退款单数
退款单数 ÷ 总订单数 = 退款率
ROUND(字段,3) 保留 3 位小数,报表格式统一
业务用途运营月度复盘、售后数据分析、平台交易健康度报表
3. 多维度 UV 去重统计
sql
SELECT
channel,
COUNT(DISTINCT user_id) uv,
COUNT(DISTINCT device_id) device_uv
FROM dwd_user_visit
WHERE dt>='2026-05-01'
GROUP BY channel;
channel 代表流量渠道:APP、小程序、短视频、网页
COUNT(DISTINCT user_id) 真实注册用户去重人数,行业标准 UV
COUNT(DISTINCT device_id) 手机设备去重数量,防止同一用户多账号刷流量
WHERE 时间过滤,走分区裁剪,极大提升查询速度
按照渠道分组,统计各渠道流量质量
业务用途投放广告数据分析、渠道引流效果评估
三、Pyspark
今日重点:PySpark 数据倾斜彻底解决方案 ② 热点 Key 过滤 + 拆分处理
-
适用场景
业务中存在固定已知热点数据:0 值、空值、null、超级大客户、默认填充值
任务执行时只有个别 task 运行极慢,其余 task 秒跑完,典型数据倾斜
不想使用加盐打散,追求代码简单、逻辑不变
-
核心原理
把一份完整数据强制拆分成两份
倾斜热点数据 → 单独拉出来单独计算
正常平稳数据 → 走原有正常业务逻辑
最后两份结果合并,彻底规避热点扎堆拥堵
-
实战处理思路
第一步:过滤出倾斜热点数据单独计算
第二步:正常数据正常聚合 / 关联
第三步:两部分结果合并 union
-
核心企业代码
python
from pyspark.sql.functions import col,count
# 1. 手动定义业务内已知倾斜热点key黑名单
hot_keys = ["0","","null","999999"]
# 2. 数据拆分
hot_df = df.filter(col("user_id").isin(hot_keys)) # 筛选倾斜数据
normal_df = df.filter(~col("user_id").isin(hot_keys)) # 筛选普通正常数据
# 3. 两份数据执行一模一样聚合逻辑
hot_result = hot_df.groupBy("user_id").agg(count("*").alias("act_cnt"))
normal_result = normal_df.groupBy("user_id").agg(count("*").alias("act_cnt"))
# 4. 合并最终结果
final_df = hot_result.unionByName(normal_result)
-
项目经验
离线大屏、用户行为统计最常用倾斜解法,比加盐更简单高效
-
调优小技巧
python
# 给倾斜数据单独调高执行器内存,防止内存溢出
spark.conf.set("spark.executor.memory","12g")
# 增大shuffle读写缓冲区,加快倾斜数据读写速度
spark.conf.set("spark.shuffle.file.buffer","128k")
总结
热点 key 数量少、可枚举 → 拆分过滤法(首选)
热点 key 杂乱无规律 → 加盐打散法
大表 join 小表倾斜 → 广播 join
四、算法
最长公共前缀
python
def longestCommonPrefix(strs):
if not strs:
return ""
pre = strs[0]
for s in strs[1:]:
while not s.startswith(pre):
pre = pre[:-1]
return pre
思路全解
先判断数组为空,直接返回空字符串,做边界防护
默认把第一个字符串当作初始公共前缀
遍历后面所有字符串依次比对
startswith() 判断当前字符串是否以前缀开头
不匹配就删掉前缀最后一个字符,循环缩减
全部比对完成,剩下字符串就是全局最长公共前缀
大数据实战作用清洗日志统一前缀字段归类
批量匹配同网段 IP 数据
设备编号、日志路径批量分组归类
数据预处理高频通用思路