apache-spark - 如何使用加盐技术连接具有倾斜数据的数据帧
问题描述
我是 spark 新手,并试图了解如何处理 spark 中的倾斜数据。我创建了两个表员工和部门。员工扭曲了其中一个部门的数据。
解决方案之一是广播部门表,效果很好。但我想了解如何在下面的代码中使用盐渍技术来提高性能。
from pyspark.sql import SparkSession
import pyspark.sql.functions as f
spark = SparkSession.builder.appName("skewTestSpark").config("spark.sql.warehouse.dir",
'/user/hive/warehouse').enableHiveSupport().getOrCreate()
df1 = spark.sql("select * from spark.employee")
df2 = spark.sql("select id as dept_id, name as dept_name from spark.department")
res = df1.join(df2, df1.department==df2.dept_id)
res.write.parquet("hdfs://<host>:<port>/user/result/employee")
解决方案
员工(即使存在偏差)也不太可能导致 Spark 瓶颈。事实上,这个例子是有缺陷的。想想大型的大型 JOIN,而不是适合广播联接类别的东西。
加盐:在 SQL 连接或分组等操作上使用“加盐”,更改键以以均匀的方式重新分配数据,以便任何给定分区的任何操作的处理时间都相似。
JOIN 的一个很好的例子是:https ://dzone.com/articles/why-your-spark-apps-are-slow-or-failing-part-ii-da
我推荐的另一本好书在这里:https ://godatadriven.com/blog/b-efficient-large-spark-optimisation/
我可以解释这一切,但第一个链接解释得很好。需要一些实验来获得更好的密钥分配。
推荐阅读
- javascript - 克隆对象数组但具有选定的属性
- objective-c - 向 JS React Native 发送事件
- python - 我想使用正则表达式在python中返回索引
- python - 如何在 Python 中单独更新海龟
- python - 如何在图像中找到区域最大值/最小值?
- javascript - 为什么这会解析为日期?
- java - 是否有一致的方法来跟踪 Java 中剪辑(或音频文件)中的位置?
- php - ODBC 不想与 pdo 连接
- jquery - 加载 Autodesk Forge 查看器时是否有任何 jquery 方法可以调用属性面板?
- python - 图像在烧瓶创建的报告中出现拉伸