apache-spark - spark.sql.shuffle.partitions 和 df.repartition 之间的区别(如果有的话)
问题描述
我在调和sqlContext.sql("set spark.sql.shuffle.partitions=n")
使用df.repartition(n)
.
Spark 文档表明set spark.sql.shuffle.partitions=n
配置了混洗数据时使用的分区数,而df.repartition
似乎返回了一个按指定键数分区的新 DataFrame。
为了让这个问题更清楚,这里有一个关于我如何相信df.reparition
和spark.sql.shuffle.partitions
工作的玩具示例:
假设我们有一个 DataFrame,如下所示:
ID | Val
--------
A | 1
A | 2
A | 5
A | 7
B | 9
B | 3
C | 2
- 场景 1:3 个 Shuffle Partitions,Reparition DF by ID:如果我要设置
sqlContext.sql("set spark.sql.shuffle.partitions=3")
然后执行df.repartition($"ID")
,我希望我的数据被重新分区为 3 个分区,一个分区包含 ID 为“A”的所有行的 3 个 val,另一个保存 ID 为“B”的所有行的 2 个 val,最后一个分区保存 ID 为“C”的所有行的 1 个 val。 - 场景 2:5 个 shuffle 分区,Reparititon DF by ID:在这种情况下,我仍然希望每个分区只保存带有相同 ID 标记的数据。也就是说,在同一个分区中不会有不同 ID 的行混合。
我的理解在这里不成立吗?一般来说,我的问题是:
我正在尝试优化数据帧的分区以避免偏差,但要让每个分区尽可能多地保存相同的关键信息。我如何使用
set spark.sql.shuffle.partitions
and实现这一点df.repartiton
?set spark.sql.shuffle.partitions
和之间有联系df.repartition
吗?如果是这样,那个链接是什么?
谢谢!
解决方案
我希望我的数据被重新划分为 3 个分区,一个分区保存 ID 为“A”的所有行的 3 个 val,另一个保存 ID 为“B”的所有行的 2 个 val,最后一个分区保存 1 个 val ID 为“C”的所有行。
不
5 shuffle partitions,Reparititon DF by ID:在这种情况下,我仍然希望每个分区只保存带有相同 ID 标记的数据。也就是说,在同一个分区内不会有不同 ID 的行混合。
和不。
这不是分区的工作方式。Partitioners
将值映射到分区,但一般情况下的映射不是唯一的(您可以查看HashPartitioner 如何工作?以获得详细说明)。
set spark.sql.shuffle.partitions 和 df.repartition 之间有联系吗?如果是这样,那个链接是什么?
确实有。如果您df.repartition
,但不提供分区数,则spark.sql.shuffle.partitions
使用。
推荐阅读
- php - 我在这个 foreach 循环中做错了什么?
- javascript - 将 props 传递给封装在 HOC 中的 React Redux 连接组件
- javascript - Vue.js - 在悬停时添加删除按钮并在按下按钮时删除它
- asp.net - 用户“SQLLogin”的 Asp.net LocalDB (SQL) 登录失败
- node.js - 使用 eventemitter 监听事件
- hive - Impala - 将 MON-YY 转换为 YYYYMM
- arduino - Sony Spresense + Arduino:连接基于 W5500 的以太网,如果
- apache-spark - 每次触发后如何更新 HDFS 文件?
- javascript - 在 marklogic 中找不到来自不同数据库的模块
- java - 如何引用部署在 jboss 环境中的 src/main/resources 文件夹中的文件?