当前位置: 首页 > article >正文

PySpark广播表连接解决数据倾斜的完整案例

使用PySpark解决数据倾斜问题的完整案例,通过广播表连接的方式来优化性能。

  1. 准备数据

假设我们有两张表,一张大表 big_table 和一张小表 small_table ,小表将作为广播表。

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("Data Skew Example").getOrCreate()

# 模拟大表数据
big_table = spark.createDataFrame([(i, f"value_{i}") for i in range(1000000)], ["id", "data"])

# 模拟小表数据
small_table = spark.createDataFrame([(i, f"category_{i%10}") for i in range(100)], ["id", "category"])
  1. 查看广播表大小
import sys
from pyspark.sql.functions import col

# 查看小表的大小,单位字节
small_table_size = small_table.select(col("*")).count() * sys.getsizeof(tuple(small_table.first()))
print(f"Size of small_table: {small_table_size} bytes")
  1. 初始连接(产生数据倾斜)
# 不使用广播进行连接,会产生数据倾斜

joined_without_broadcast = big_table.join(small_table, "id")
  1. 使用广播表连接
from pyspark.sql.functions import broadcast

# 使用广播表连接
joined_with_broadcast = big_table.join(broadcast(small_table), "id")
  1. 查看Spark WebUI分析数据倾斜

运行作业:在执行上述代码时,Spark会启动作业,可以通过Spark WebUI查看作业执行情况。在浏览器中访问 http://:4040 (这是Spark默认的WebUI端口,实际可能不同)。
查看阶段详情:进入“Jobs”页面,找到对应的作业,点击进入查看各阶段(Stage)详情。在阶段详情里,可以看到任务(Task)的执行时间分布。没有广播时,数据倾斜表现为部分任务执行时间远长于其他任务;使用广播后,任务执行时间应更均匀。
查看执行计划:也可以通过调用 joined_with_broadcast.explain() 查看执行计划,确认广播表是否正确应用。

# 查看执行计划
joined_with_broadcast.explain()
  1. 完整代码示例
from pyspark.sql import SparkSession
import sys
from pyspark.sql.functions import col, broadcast

# 初始化SparkSession
spark = SparkSession.builder.appName("Data Skew Example").getOrCreate()

# 模拟大表数据
big_table = spark.createDataFrame([(i, f"value_{i}") for i in range(1000000)], ["id", "data"])

# 模拟小表数据
small_table = spark.createDataFrame([(i, f"category_{i%10}") for i in range(100)], ["id", "category"])

# 查看小表的大小,单位字节
small_table_size = small_table.select(col("*")).count() * sys.getsizeof(tuple(small_table.first()))
print(f"Size of small_table: {small_table_size} bytes")

# 不使用广播进行连接,会产生数据倾斜
joined_without_broadcast = big_table.join(small_table, "id")

# 使用广播表连接
joined_with_broadcast = big_table.join(broadcast(small_table), "id")

# 查看执行计划
joined_with_broadcast.explain()

这个案例先创建了大小两张表,查看小表大小以确认适合广播,演示了普通连接产生数据倾斜的情况,接着使用广播表连接解决该问题,并说明了如何从Spark WebUI查看数据倾斜的发生与解决效果。


http://www.kler.cn/a/501199.html

相关文章:

  • P10打卡——pytorch实现车牌识别
  • 【Go】:图片上添加水印的全面指南——从基础到高级特性
  • CSS 盒模型
  • MACPA:fMRI连接性分析的新工具
  • Matlab一些使用技巧
  • Python爬虫基础——数据清洗
  • 多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现
  • Filebeat es
  • C# 解决“因为算法不同,客户端和服务器无法通信”的问题
  • vue3+ts+element-plus 对话框el-dialog设置圆角
  • Java基础面试题day02——数据类型
  • 【非常详细】TCP/IP协议详解
  • Unity3d 基于Barracuda推理库和YOLO算法实现对象检测功能
  • 采用GPT生成的Python 的 2048 游戏
  • 一些计算机零碎知识随写(25年1月)-1
  • Observability:将 OpenTelemetry 添加到你的 Flask 应用程序
  • 深入学习Fanout Exchange交换机
  • Java列表示例
  • 于交错的路径间:分支结构与逻辑判断的思维协奏
  • IP vs 子系统 Vs SoC 验证
  • import语句详解
  • C#中收发QQ邮箱电子邮件
  • 负载均衡服务器要怎么配置?
  • 计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)
  • 【数据库】Unity 使用 Sqlite 数据库
  • 上手体验微软全新整合的王炸平台Fabric