一、Linux
1. 查看系统开机至今所有用户登录记录
bash
last
读取系统登录日志,展示所有账号登录时间、IP、终端信息
实战场景:集群安全审计、异常账号登录排查、运维行为追溯
2. HDFS 递归创建多级目录并设置权限
bash
hdfs dfs -mkdir -p /user/bigdata/etl/log/202605 && hdfs dfs -chmod 755 /user/bigdata/etl/log/202605
-p:递归创建多级目录,上级目录不存在也可正常创建,避免报错
chmod 755:设置目录权限,所有者读写执行,其他用户可读可执行
大数据分层目录初始化、脚本落地目录标配操作
3. 筛选当前运行中所有 Python 进程并查看详情
bash
ps -aux | grep python3 | grep -v grep
ps -aux 展示进程完整信息(用户、CPU、内存、启动命令)
过滤 Python3 进程,排除 grep 自身进程
排查 PySpark 后台任务、数据同步脚本卡死、僵尸进程专用
二、SQL
表结构说明
dwd_express_info 物流快递表:order_id,user_id,express_no,trans_status,trans_city,dt
dwd_user_tag 用户标签表:user_id,age_tag,consume_tag,active_tag,dt
dws_hourly_sales 小时级销售宽表:dt,hour,sale_amt,order_cnt,refund_cnt
1. 统计各城市物流运输状态分布
sql
SELECT
trans_city,
trans_status,
COUNT(order_id) AS order_num
FROM dwd_express_info
WHERE dt = '2026-05-25'
GROUP BY trans_city, trans_status
ORDER BY trans_city, order_num DESC;
按城市 + 物流状态双维度分组,统计对应订单量
trans_status 区分运输中、已签收、退回、异常等状态
业务用途:物流网点运营监控、异常包裹地域分析、配送效率评估
2. 不同年龄 & 消费标签组合的用户数量统计
sql
SELECT
age_tag,
consume_tag,
COUNT(DISTINCT user_id) AS user_cnt
FROM dwd_user_tag
WHERE dt = '2026-05-25'
GROUP BY age_tag, consume_tag
ORDER BY user_cnt DESC;
多标签交叉维度统计,是用户画像分析核心写法
可精准定位核心客群,支撑精准营销、活动策划
基于分区过滤数据,规避全表扫描,提升查询性能
3. 计算每日各时段订单退款率、峰值时段定位
sql
SELECT
hour,
order_cnt,
refund_cnt,
ROUND(refund_cnt / order_cnt, 4) AS refund_rate
FROM dws_hourly_sales
WHERE dt = '2026-05-25'
ORDER BY hour;
基于预聚合小时宽表做指标计算,减少重复计算,提升查询效率
退款率反映对应时段交易质量,定位高退款风险时段
数仓 DWS 层报表取数标准用法,线上运营监控高频使用
三、Pyspark
今日重点:PySpark 数据分区规则 + 手动控制分区并行度
- 应用场景
默认分区不合理,导致任务并行度不足、执行缓慢,或分区过多产生海量小文件;手动调整分区适配集群资源与数据量。 - 完整代码 + 逐行注释
python
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("PartitionOpt").getOrCreate()
# 1. 读取原始数据,查看默认分区数
df = spark.read.parquet("/user/hive/dwd/order_info")
print("默认分区数:", df.rdd.getNumPartitions())
# 2. 场景1:增大分区,提升并行计算能力(会触发Shuffle)
df_more_part = df.repartition(30)
print("重分区后分区数:", df_more_part.rdd.getNumPartitions())
# 3. 场景2:减少分区,合并小文件(无Shuffle,高效)
df_less_part = df.coalesce(8)
print("合并后分区数:", df_less_part.rdd.getNumPartitions())
# 4. 基于指定字段分区(分区表写入常用)
df_part_by_field = df.repartition(10, col("dt"))
# 写入分区表,分区字段为dt
df_part_by_field.write.mode("overwrite")\
.partitionBy("dt")\
.saveAsTable("dwd.order_partition")
spark.stop()
-
核心知识点详解
- 分区查看
rdd.getNumPartitions():获取当前 DataFrame 实际分区数,调优第一步必查。 - repartition(num / repartition(num, col))
全面重分区,一定会触发 Shuffle,数据全局打散
适用:需要提升并行度、按业务字段分区写入分区表 - coalesce(num)
仅减少分区,不触发 Shuffle,性能远高于 repartition
禁止用它增大分区,无法提升并行度 - partitionBy
写入 Hive 分区表专用,按照指定字段生成目录分区,是数仓分层落地的核心写法
- 分区查看
-
生产调优规范 & 避坑
单分区数据建议控制在 128MB~256MB,平衡计算效率与小文件问题
离线任务默认 Shuffle 分区参数调整:
python
# 全局设置Shuffle默认分区数
spark.conf.set("spark.sql.shuffle.partitions", "24")
流处理任务分区数建议和 Kafka 分区数保持一致,避免数据倾斜
- 面试核心考点
区分 repartition 和 coalesce 的底层原理、性能差异、适用场景
四、算法
滑动窗口最大值
python
from collections import deque
def maxSlidingWindow(nums, k):
q = deque()
res = []
for idx, val in enumerate(nums):
# 维护队列:队首始终为当前窗口最大值,移除队列内小于当前值的元素
while q and nums[q[-1]] < val:
q.pop()
q.append(idx)
# 移除超出窗口左边界的下标
while q[0] <= idx - k:
q.popleft()
# 窗口形成后,记录结果
if idx >= k - 1:
res.append(nums[q[0]])
return res
思路讲解
借助单调队列实现,队列中只存数组下标,对应数值从大到小排列
遍历数组,新元素不断弹出队列尾部更小元素,保证队列单调性
检查队首下标是否滑出窗口范围,超出则移除
窗口长度达标后,队首元素即为当前窗口最大值
大数据实战用途实时数据流窗口统计(最大值、极值监控)
时序数据、设备指标、交易数据滑动窗口分析
PySpark Structured Streaming 窗口计算的经典算法思想参考