一、Linux
查看当前服务器所有监听端口及对应进程
过滤日志中 ERROR 并输出前 10 行
后台运行脚本 task.sh,不占用终端
bash
ss -tulnp
grep ERROR app.log | head -10
nohup sh task.sh &
ss -tulnp
查看 TCP/UDP 监听端口 + 对应进程 PID
排查端口占用、服务端口监听、防火墙调试必备
grep ... | head -10过滤关键字并限制输出行数,避免日志刷屏
nohup 命令 &
nohup 脱离终端守护运行
& 放入后台大数据脚本、定时任务常用部署方式
二、SQL
577. 员工奖金

sql
SELECT
e.name,
b.bonus
FROM Employee e
LEFT JOIN Bonus b
ON e.empId = b.empId;
LEFT JOIN 左外连接
保留左表所有员工,匹配不到奖金自动为 NULL
业务场景
用户主表 + 业绩 / 奖金维度表关联,数仓最常用关联方式
不需要 IFNULL,题目要求无奖金直接返 null
608. 树节点

sql
SELECT
id,
CASE
WHEN p_id IS NULL THEN 'Root'
WHEN id NOT IN (SELECT DISTINCT p_id FROM Tree WHERE p_id IS NOT NULL) THEN 'Leaf'
ELSE 'Inner'
END AS type
FROM Tree;
树形结构 SQL 判断模板
p_id IS NULL → 根节点
id 不出现在父节点列表 → 叶子节点
其余为中间节点
子查询筛选所有父节点 ID
面试常考:自关联树形层级判断
1141. 查询近 30 天活跃用户数

sql
SELECT
activity_date AS day,
COUNT(DISTINCT user_id) AS active_users
FROM UserActivity
WHERE activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29 DAY)
AND '2019-07-27'
GROUP BY activity_date;
DATE_SUB 日期向前偏移
COUNT(DISTINCT user_id) 日活标准统计写法
固定时间区间过滤 + 按日期分组
完全对标大数据数仓 日活、留存、用户行为统计 真实业务
三、Pyspark
左外连接补空值
树形结构节点分类判断
日期范围过滤 + 每日去重用户统计
python
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, countDistinct, date_sub
spark = SparkSession.builder \
.master("local[*]") \
.appName("Day24") \
.getOrCreate()
# 1. 左连接 员工奖金
emp = spark.createDataFrame([(1,"Alice"),(2,"Bob")], ["empId","name"])
bonus = spark.createDataFrame([(1,5000)], ["empId","bonus"])
emp.join(bonus, on="empId", how="left").show()
# 2. 日期过滤 + 日活统计(对应LC1141)
act = spark.createDataFrame([
(101, "2019-07-20"),
(102, "2019-07-20"),
(101, "2019-07-25")
], ["user_id","activity_date"])
act.filter(
col("activity_date").between(date_sub("2019-07-27", 29), "2019-07-27")
).groupBy("activity_date")
.agg(countDistinct("user_id").alias("active_users"))
.show()
spark.stop()
Spark how="left" 左外连接,和 MySQL LEFT JOIN 一致
countDistinct 计算日活
日期函数 date_sub 与 SQL 语法对齐
离线数仓日活指标标准开发模板
四、算法
141. 环形链表
python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def hasCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
快慢指针(龟兔赛跑)
有环则快慢指针一定会相遇