大数据开发学习Day42

一、Linux

1. 查找系统中大于 1GB 的日志并批量列出路径

find /opt/bigdata/logs -type f -size +1G -print

-type f:仅匹配普通文件,排除目录
-size +1G:筛选大小超过 1GB 的文件
实战场景:定期巡检超大日志文件,及时清理避免磁盘占满

2. HDFS 对比本地文件与集群文件差异

hdfs dfs -cat /user/hive/ods/test.csv | diff - /data/test.csv

hdfs dfs -cat 读取 HDFS 文件内容,通过管道交给diff
对比本地文件和 HDFS 文件内容,校验数据上传是否完整、有无篡改
数据同步、数据校验环节常用

3. 查看当前服务器已打开的文件句柄

lsof -n | wc -l

lsof:查看系统打开的文件、端口、进程句柄
大数据服务(Spark、Hadoop)句柄泄露排查专用,句柄过高会导致服务宕机

二、SQL

表结构说明
dwd_user_recharge 用户充值表:user_id, recharge_amount, recharge_time, pay_channel, dt
dwd_device_stat 设备统计表:device_id, device_type, online_duration, error_cnt, dt
dws_retention_stat 用户留存宽表:dt, user_id, first_login_dt, is_remain_1d, is_remain_7d

1. 按支付渠道统计充值笔数、总金额、单笔均值

SELECT
    pay_channel,
    COUNT(*) AS recharge_cnt,
    SUM(recharge_amount) AS total_amount,
    ROUND(AVG(recharge_amount),2) AS avg_amount
FROM dwd_user_recharge
WHERE dt >= '2026-05-01'
GROUP BY pay_channel
ORDER BY total_amount DESC;

按支付渠道分组,多维度聚合统计充值指标
单笔平均金额用于分析不同渠道用户充值习惯
排序直观展示主流支付渠道,支撑运营和财务分析

2. 统计各设备类型平均在线时长、设备故障数

SELECT
    device_type,
    ROUND(AVG(online_duration),2) AS avg_online,
    SUM(IF(error_cnt > 0, 1, 0)) AS fault_device_num
FROM dwd_device_stat
WHERE dt = '2026-05-25'
GROUP BY device_type;

物联网 / APP 运维场景经典统计,区分设备类型评估稳定性
IF 判断故障次数,统计出过故障的设备数量
用于设备版本迭代、故障专项治理分析

3. 统计每日新增用户、1 日留存率、7 日留存率

SELECT
    dt AS new_user_dt,
    COUNT(*) AS new_user_num,
    ROUND(SUM(is_remain_1d)/COUNT(*),4) AS remain_1d_rate,
    ROUND(SUM(is_remain_7d)/COUNT(*),4) AS remain_7d_rate
FROM dws_retention_stat
GROUP BY dt
ORDER BY dt;

数仓 DWS 层留存指标标准写法,互联网行业核心运营指标
is_remain_1d/is_remain_7d 为标记字段(1 留存,0 流失)
每日监控新增用户质量,判断产品拉新效果

三、Pyspark

今日重点:PySpark 开窗函数实战(企业报表高频)

  • 应用场景
    分组内排序、累计求和、滑动统计、排名计算,对应 Hive 开窗函数,用于制作运营报表、用户分层、榜单统计
  • 完整代码 + 逐行注释
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number, sum, col

spark = SparkSession.builder.appName("WindowFuncDemo").getOrCreate()

# 模拟门店销售数据
sale_data = [
    ("shop01", "2026-05-23", 2300),
    ("shop01", "2026-05-24", 1800),
    ("shop01", "2026-05-25", 3100),
    ("shop02", "2026-05-23", 4200),
    ("shop02", "2026-05-24", 2900)
]
df = spark.createDataFrame(sale_data, ["shop_id", "sale_dt", "sale_amount"])

# 定义开窗规则:按门店分组,按日期升序排列
win_spec = Window.partitionBy("shop_id").orderBy("sale_dt")

# 1. 组内排名
df = df.withColumn("rn", row_number().over(win_spec))

# 2. 分组内累计销售额(累加求和)
df = df.withColumn("cum_sale", sum("sale_amount").over(win_spec))

df.show()
spark.stop()
  • 核心知识点详解

    • Window 开窗规则
      • partitionBy:等同于 SQL PARTITION BY,数据分组
      • orderBy:组内排序,排名、累计计算必须依赖排序
    • row_number():连续不重复行号,同分不同名,取 TopN 首选
    • sum () + 开窗:实现累计求和,常用于日累计销售额、累计充值等报表
    • 拓展区分(面试考点)
      • row_number():行号连续,无并列
      • rank():允许并列,排名会跳号
      • dense_rank():允许并列,排名不跳号
  • 生产优化
    开窗函数会触发 Shuffle,数据量大时合理设置分区并行度:

spark.conf.set("spark.sql.shuffle.partitions", "20")

四、算法

二叉树层序遍历

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def levelOrder(root):
    if not root:
        return []
    res = []
    queue = deque([root])
    while queue:
        level_size = len(queue)
        current_level = []
        for _ in range(level_size):
            node = queue.popleft()
            current_level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        res.append(current_level)
    return res

思路讲解
借助队列实现广度优先遍历(BFS),逐层读取二叉树节点
每次先记录当前层节点总数,循环处理整层数据
子节点依次入队,完成分层收集

大数据实战用途
树形目录、层级分类数据逐层解析
流式数据分层消费、多节点任务队列调度逻辑参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值