apache-spark - 如何避免在分区列上的 SortMerge Join 中洗牌?
问题描述
我们得到了两个持久化的数据集,如下所示:
数据集 A:
datasetA.repartition(5, datasetA.col("region"))
.write().mode(saveMode)
.format("parquet")
.partitionBy("region")
.bucketBy(5,"studentId")
.sortBy("studentId")
.option("path", parquetFilesDirectory)
.saveAsTable( database.tableA));
数据集 B:
datasetB.repartition(5, datasetB.col("region"))
.write().mode(saveMode)
.format("parquet")
.partitionBy("region")
.bucketBy(5,"studentId")
.sortBy("studentId")
.option("path", parquetFilesDirectory)
.saveAsTable( database.tableB));
加入 region 和 studentId 会导致数据洗牌。下面是连接查询:
spark.sql("Select count(*) from database.tableA a, database.tableB b where a.studentId = b.studentId and a.region = b.region").show()
当我们包含分区键时,洗牌的原因可能是什么?我们如何减轻它?
解决方案
是的,您可以使用预排序和分组表来减轻 Shuffle
推荐阅读
- json - 不使用序列化程序的 crud 操作
- python - 使用 KivyMD 构建接口时如何修复“AttributeError: 'NoneType' object has no attribute 'rgba'”?
- java - 如何在 toString() 方法中返回 2 前导 0?
- xslt - 序列是如何拼接的,为什么我的变量值是文档节点?
- reactjs - 图像在本地服务器上运行良好,但无法在远程服务器上加载?
- rest - 单个令牌是否可以防止 RESTful API 中的 csrf?
- php - laravel eloquent whereIn 子句中可以使用的数组的最大大小是多少?
- c# - 实体框架连接来自两个不同实体的表
- java - Android - 在不长按(选择)TextView 时单击 TextView
- angular - 我无法将表单中的数据发送到 typescript angular