一、Linux / Shell
任务:批量删除当前目录下所有 .tmp 结尾的临时文件
find . -name "*.tmp" | xargs rm -f
# find . -name "*.tmp" 生成当前目录下所有.tmp文件的列表
批量删除文件
# 查找并删除所有.log文件
find . -name "*.log" | xargs rm
# 更安全的方式(处理空格文件名)
find . -name "*.log" -print0 | xargs -0 rm
批量复制文件
# 复制文件到指定目录
find . -name "*.txt" | xargs -I {} cp {} /target/dir/
# 移动特定类型的文件
ls *.jpg | xargs -I {} mv {} images/
-I {} 替换字符串 xargs -I {} cp {} /dest/
-n N 每次传递N个参数 xargs -n 1 逐个处理
-P N 并行处理,N个进程 xargs -P 4 4进程并行
-0 以null分隔(配合find -print0) find ... -print0 | xargs -0
-p 交互模式,执行前确认 xargs -p rm
xargs:把管道传来的多行文本,转为命令行参数
rm -f:强制删除,不提示
大数据场景常用:批量清理日志、临时表、小文件
二、SQL
百分比计算、累积求和、分组条件筛选
1728. 每月活跃用户数 II(日期 + 分组 + 去重)

将原始 Activity 表按 (user_id, 月份) 分组,统计每个用户每月的不同活跃日期数
WITH user_days AS (
SELECT
user_id,
DATE_FORMAT(activity_date, '%Y-%m') AS month,
COUNT(DISTINCT activity_date) AS days
FROM Activity
GROUP BY user_id, month
)
SELECT
month,
COUNT(DISTINCT user_id) AS active_users
FROM user_days
WHERE days >= 2
GROUP BY month;
DATE_FORMAT(activity_date, ‘%Y-%m’)
把日期(如 2026-04-09)格式化成 ‘2026-04’,用于按月聚合
1204. 最后一个能进入电梯的人(累积和 + 上限判断)

WITH weight_sum AS (
SELECT
name,
SUM(weight) OVER (ORDER BY turn) AS total
FROM Queue
)
SELECT name
FROM weight_sum
WHERE total <= 1000
ORDER BY total DESC
LIMIT 1;
SUM(weight) OVER (ORDER BY turn) 是窗口函数
ORDER BY turn 确保按排队顺序累加
550. 游戏玩法分析 IV(次日留存率,面试必考)

WITH first_login AS (
SELECT player_id, MIN(event_date) AS first_date
FROM Activity
GROUP BY player_id
)
SELECT
ROUND(
COUNT(DISTINCT a.player_id) / COUNT(DISTINCT f.player_id),
2
) AS fraction
FROM first_login f
LEFT JOIN Activity a
ON f.player_id = a.player_id
AND a.event_date = DATE_ADD(f.first_date, 1);
CTE 找首登日期:MIN(event_date) 定位每个玩家第一天登录
次日判断:DATE_ADD(日期, 1) 精准匹配第二天
留存率公式:次日登录人数 / 总玩家数
去重计数:必须用 COUNT(DISTINCT) 避免同一天多次登录干扰 ROUND
保留 2位小数:面试标准输出格式
三、PySpark 核心新内容
自定义函数 Pandas UDF + 数据倾斜实战 + 分区优化
在PySpark分布式计算中,数据倾斜(某些分区数据量过大)是常见瓶颈,会导致任务执行缓慢甚至失败。Pandas UDF(User Defined Function)结合分区优化能高效缓解此问题:它利用Spark的分布式架构,将数据分块处理为pandas DataFrame,在分区级别应用向量化操作,减少JVM与Python的通信开销,同时通过自定义分区策略确保负载均衡
直接在 PyCharm 运行:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import DoubleType
import pandas as pd
spark = SparkSession.builder \
.master("local[*]") \
.appName("day8") \
.getOrCreate()
# 构造数据
data = [(1, 20.0), (2, 30.0), (3, 40.0), (4, 50.0)]
df = spark.createDataFrame(data, ["id", "score"])
# ==================== 新知识点1:Pandas UDF(性能远高于普通UDF)====================
@pandas_udf(DoubleType())
def norm_score(s: pd.Series) -> pd.Series:
return s / 100
df = df.withColumn("norm_score", norm_score(F.col("score")))
df.show()
# ==================== 新知识点2:重分区 & 合并小文件 ====================
# 增加分区
df_repart = df.repartition(4)
# 合并分区
df_coalesce = df_repart.coalesce(1)
# ==================== 新知识点3:数据倾斜常用解法:加盐聚合 ====================
df_salt = df.withColumn("salt", F.floor(F.rand() * 3))
df_salt.groupBy("id", "salt").count().show()
spark.stop()
结果
+---+-----+----------+
| id|score|norm_score|
+---+-----+----------+
| 1| 20.0| 0.2|
| 2| 30.0| 0.3|
| 3| 40.0| 0.4|
| 4| 50.0| 0.5|
+---+-----+----------+
Pandas UDF 用法
基于 Arrow 格式,速度是普通 UDF 的 10~100 倍
repartition 与 coalesce 区别
repartition(n):全量重分区,可增可减,有 shuffle
coalesce(n):只减不增,无 shuffle,用于合并小文件
加盐 + 两阶段聚合解决数据倾斜
随机前缀 + 两阶段聚合,解决单分区爆量
分区数对性能的影响
小知识点:
生产环境禁止大量小文件,必须用 coalesce 合并
四、算法
LeetCode 3. 无重复字符的最长子串
掌握滑动窗口双指针写法
理解用哈希集合 / 字典维护窗口
时间复杂度 O (n)
def lengthOfLongestSubstring(s: str) -> int:
char_map = {}
left = 0
max_len = 0
for right, c in enumerate(s):
if c in char_map and char_map[c] >= left:
left = char_map[c] + 1
char_map[c] = right
max_len = max(max_len, right - left + 1)
return max_len
166

被折叠的 条评论
为什么被折叠?



