一、Linux
1. 实时监控 Spark / YARN 任务运行状态
bash
watch -n 1 "yarn application -list | grep -i spark"
watch -n 1:每 1 秒自动刷新一次
yarn application -list:列出 YARN 上所有运行任务
grep -i spark:只看 Spark 任务
用途:实时监控离线任务是否卡住、是否正常运行
2. 统计 HDFS 上指定目录的文件总数
bash
hdfs dfs -count /user/hive/dwd/user_behavior
快速统计目录下文件数量
用于判断是否产生大量小文件
数仓巡检、小文件合并前必查
3. 查看最近 100 行 Spark 任务异常日志
bash
tail -n 100 /data/spark/logs/spark-app.log | grep -A 5 -B 5 Exception
tail -n 100:只看最后 100 行最新日志
grep -A 5 -B 5 Exception:抓取异常行上下 5 行上下文
生产排错最快方式
二、SQL
表结构
dwd_user_pay:用户支付表 user_id, order_id, pay_amount, pay_time, dt
dwd_app_log:APP 日志表 user_id, event_id, page_id, event_time, dt
dwd_goods_sale:商品销售表 goods_id, cate_id, sale_amount, sale_num, dt
1. 统计每个用户的累计消费金额 & 最近一次消费时间
sql
SELECT
user_id,
SUM(pay_amount) AS total_pay, -- 累计消费
MAX(pay_time) AS last_pay_time -- 最近一次消费时间
FROM dwd_user_pay
WHERE dt >= '2026-04-01'
GROUP BY user_id;
电商用户价值分层、会员等级评定核心指标
时间分区过滤,避免全表扫描
2. 统计每个页面的访问次数、访问人数
sql
SELECT
page_id,
COUNT(*) AS pv, -- 页面访问次数
COUNT(DISTINCT user_id) AS uv -- 页面访问人数
FROM dwd_app_log
WHERE dt = '2026-05-23'
GROUP BY page_id;
最经典的 PV/UV 统计
运营分析页面热度、用户留存、转化漏斗
3. 统计每个品类下销售额最高的 3 个商品
sql
SELECT *
FROM (
SELECT
goods_id,
cate_id,
sale_amount,
RANK() OVER(PARTITION BY cate_id ORDER BY sale_amount DESC) rk
FROM dwd_goods_sale
) t
WHERE rk <= 3;
分组内排序取 TopN,面试必考
用于商品爆款排行、品类运营分析
三、Pyspark
今日重点:PySpark 生产最常用 ------ 小文件合并实战
- 为什么要合并小文件?
小文件太多 → NameNode 压力巨大
查询极慢、任务卡死、集群不稳定
离线数仓 必须定期合并 - 企业标准合并代码
python
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("MergeSmallFiles").getOrCreate()
# 1. 读取需要合并的表
df = spark.read.table("dwd.user_behavior")
# 2. 减少分区 = 合并小文件(无shuffle,最快)
df = df.coalesce(10)
# 3. 覆盖写入,自动合并成 10 个文件
df.write.mode("overwrite").saveAsTable("dwd.user_behavior_new")
spark.stop()
coalesce(N):减少分区,不 shuffle,速度最快
repartition(N):会 shuffle,数据更均匀,但慢
生产优先用 coalesce 合并小文件
一般一个文件目标大小 128MB ~ 256MB
- 生产实战参数
python
spark.conf.set("spark.sql.adaptive.enabled", "true")
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
开启后 Spark 自动合并小文件
四、算法
删除链表的倒数第 N 个节点
python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def removeNthFromEnd(head, n):
dummy = ListNode(0, head)
fast = slow = dummy
# 快指针先走 n 步
for _ in range(n):
fast = fast.next
# 快慢一起走
while fast.next:
fast = fast.next
slow = slow.next
# 删除节点
slow.next = slow.next.next
return dummy.next
详细思路
快慢指针,一次遍历搞定
快指针先走 N 步,然后同步走
慢指针最终停在倒数 N+1 位置
直接跳过下一个节点 = 删除
大数据用途日志链表结构清洗、流式数据截断、内存结构优化高频思想