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

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.lryc.cn/news/520633.html

相关文章:

  • Chromium CDP 开发(十二):为自己的Domain建立custom_config.json
  • 【Vue】全局/局部组件使用流程(Vue2为例)
  • Vue.js组件开发详解
  • 解决:ubuntu22.04中IsaacGymEnv保存视频报错的问题
  • 深度学习camp-第J7周:对于ResNeXt-50算法的思考
  • java: 错误: 无效的源发行版:17解决办法
  • Docker 安装开源的IT资产管理系统Snipe-IT
  • Go语言封装加解密包(AES/DES/RSA)
  • sql server 对 nvarchar 类型的列进行 SUM() 运算
  • java中json字符串键值获取
  • MPLS原理及配置
  • 口碑很好的国产LDO芯片,有哪些?
  • 【流程设计】类似钉钉的流程设计功能样式demo
  • ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
  • 测试开发之面试宝典
  • 399. 除法求值【 力扣(LeetCode) 】
  • 算法日记1:洛谷p2678跳石头(二分答案)
  • Unity shader中真的可以动态关闭Stencil Test吗?
  • YOLOv9改进,YOLOv9自研检测头融合HyCTAS的Self_Attention自注意力机制,2024,适合目标检测、分割任务
  • 计算机网络 (36)TCP可靠传输的实现
  • Git版本控制 - 创建使用Repository
  • MySQL —— 在CentOS9下安装MySQL
  • LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
  • Nginx 可观测性最佳实践
  • LabVIEW光流跟踪算法
  • Jira用例自动去除summary重复用例
  • 基于openEuler22.03SP4部署Prometheus+Grafana
  • 泛目录和泛站有什么差别
  • css 布局及动画应用(flex+transform+transition+animation)
  • springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)