大数据开发学习Day44

一、Linux

1. 查看系统开机至今所有用户登录记录

last

读取系统登录日志,展示所有账号登录时间、IP、终端信息
实战场景:集群安全审计、异常账号登录排查、运维行为追溯

2. HDFS 递归创建多级目录并设置权限

hdfs dfs -mkdir -p /user/bigdata/etl/log/202605 && hdfs dfs -chmod 755 /user/bigdata/etl/log/202605

-p:递归创建多级目录,上级目录不存在也可正常创建,避免报错
chmod 755:设置目录权限,所有者读写执行,其他用户可读可执行
大数据分层目录初始化、脚本落地目录标配操作

3. 筛选当前运行中所有 Python 进程并查看详情

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. 统计各城市物流运输状态分布

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. 不同年龄 & 消费标签组合的用户数量统计

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. 计算每日各时段订单退款率、峰值时段定位

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 数据分区规则 + 手动控制分区并行度

  • 应用场景
    默认分区不合理,导致任务并行度不足、执行缓慢,或分区过多产生海量小文件;手动调整分区适配集群资源与数据量。
  • 完整代码 + 逐行注释
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 分区参数调整:

# 全局设置Shuffle默认分区数
spark.conf.set("spark.sql.shuffle.partitions", "24")

流处理任务分区数建议和 Kafka 分区数保持一致,避免数据倾斜

  • 面试核心考点
    区分 repartition 和 coalesce 的底层原理、性能差异、适用场景

四、算法

滑动窗口最大值

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 窗口计算的经典算法思想参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值