大数据开发学习Day8

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值