PySpark实现导出两个包含多个Parquet数据文件的S3目录里的对应值的差异值分析

编写PySpark代码实现从一个包含多个Parquet数据文件的Amazon S3目录的dataframe数据里取两个维度字段,一个度量字段的数据,根据这两个维度字段的数据分组统计,计算度量字段的数据的分组总计值,得到一个包含两个维度字段和度量字段的分组总计值字段的dataframe,再从另一个包含多个Parquet数据文件的S3目录的dataframe数据里取两个维度字段,一个度量字段的数据组成一个dataframe,将这两个字段的对应字段full outer join起来,显示所有字段和两个度量字段值相减的值,以及相减的值除以第一个dataframe的度量值的百分比数值。

PySpark代码:

python 复制代码
from pyspark.sql import SparkSession
from pyspark.sql.functions import sum, col, coalesce, lit

# 初始化SparkSession
spark = SparkSession.builder \
    .appName("MetricComparison") \
    .getOrCreate()

# 读取第一个S3目录数据并进行聚合
df1 = spark.read.parquet("s3a://your-bucket/first-data-path/")
df1_agg = df1.select("dim_col1", "dim_col2", "metric_col") \
    .groupBy("dim_col1", "dim_col2") \
    .agg(sum("metric_col").alias("total_metric1"))

# 读取第二个S3目录数据并进行聚合
df2 = spark.read.parquet("s3a://your-bucket/second-data-path/")
df2_agg = df2.select("dim_col1", "dim_col2", "metric_col") \
    .groupBy("dim_col1", "dim_col2") \
    .agg(sum("metric_col").alias("total_metric2"))

# 执行Full Outer Join
joined_df = df1_agg.join(
    df2_agg,
    ["dim_col1", "dim_col2"],
    "full_outer"
)

# 计算度量差值及百分比
result_df = joined_df.withColumn(
    "metric_diff",
    coalesce(col("total_metric1"), lit(0)) - coalesce(col("total_metric2"), lit(0))
).withColumn(
    "percentage_diff",
    (col("metric_diff") / coalesce(col("total_metric1"), lit(1))) * 100
)

# 显示结果(可根据需要调整显示行数)
result_df.show(truncate=False)

关键步骤说明:

  1. 数据读取与聚合

    • 从两个S3路径分别读取Parquet数据
    • 使用groupBy对两个维度字段分组
    • 使用sum聚合函数计算度量字段总计
  2. 表连接

    • 使用full_outer连接方式合并两个数据集
    • 保留两个表中所有的维度组合
  3. 差值计算

    • 使用coalesce处理空值(将null转换为0进行运算)
    • 计算绝对值差值和百分比差值
    • 添加防止除零机制(将分母null转换为1)

注意事项:

  1. 需要将代码中的以下占位符替换为实际值:

    • s3a://your-bucket/first-data-path/
    • s3a://your-bucket/second-data-path/
    • dim_col1, dim_col2(维度字段名)
    • metric_col(度量字段名)
  2. 如果数据量较大:

    • 建议添加缓存策略.cache()
    • 调整shuffle分区数:spark.conf.set("spark.sql.shuffle.partitions", 200)
  3. 空值处理策略可根据业务需求调整:

    • 当前代码将null视为0进行计算
    • 如需保留null可使用.withColumn("metric_diff", col("total_metric1") - col("total_metric2"))
  4. 结果输出方式:

    • 当前使用.show()直接打印
    • 可改用.write方法写入存储系统

最终结果示例:

复制代码
+---------+---------+-------------+-------------+-----------+------------------+
|dim_col1 |dim_col2 |total_metric1|total_metric2|metric_diff|percentage_diff   |
+---------+---------+-------------+-------------+-----------+------------------+
|A        |X        |1500         |1200         |300        |20.0              |
|B        |Y        |800          |null         |800        |100.0             |
|C        |Z        |null         |500          |-500       |null              |
+---------+---------+-------------+-------------+-----------+------------------+
相关推荐
卷心菜的学习路16 分钟前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题
winfredzhang39 分钟前
用 wxPython 打造「Claude Code 任务启动器」:一个把 AI CLI 变成一键工作流的桌面工具
python·wxpython·powershell·剪贴板·claudecodecli
Logintern0943 分钟前
DeepAgents 的子 Agent 如何实现上下文隔离
python
金銀銅鐵1 小时前
[Python] 借助 Turtle 来展示汉诺塔
python·数学
暴躁的小鸟1 小时前
附近口碑好的斜视配镜训练的眼视光中心
人工智能·python·深度学习
Data_Journal1 小时前
如何使用 Java 和 Jsoup 解析 HTML
大数据·开发语言·数据库·python·scrapy
如何原谅奋力过但无声2 小时前
现代化Python工具:uv、Ruff、Pyright、Rich(只讲重点版)
vscode·python·uv
Logintern092 小时前
DeepAgents 主-子 Agent 的底层实现逻辑完全基于 LangGraph 的图机制
python
码云骑士2 小时前
97-Milvus从零到生产-Standalone-vs-Cluster-索引选择-分片监控扩容
python·milvus
accept 99%2 小时前
python版提取 PDF 的常用第三方库与工具
开发语言·python·pdf