当前位置: 首页 > 知识库问答 >
问题:

当底层表被扣入时,Spark如何在连接表时减少洗牌

邓嘉致
2023-03-14

我在多个论坛上读到,当您的基础表被存储桶和排序时,在执行排序合并联接时,随机播放会减少。但是,我的问题如下

排序的存储桶只会保证存储桶中的数据大约是相同的一组键,并且数据被排序。假设我们有2个数据帧d1和d2,两者都被排序和扣分。

  1. spark是否保证包含key1和key2数据的d1表的bucketx与包含key1与key2的d2表的bucky在同一台机器上

如果保证 bucketx 和 buckety 位于同一台计算机上,则在执行排序-合并联接时,节点之间将没有 Exchange。如果他们可以坐在不同的机器上。那么在做连接时应该有数据交换。

请帮助理解这个概念。提前谢谢。

共有1个答案

於鸿羲
2023-03-14

你的理解是正确的。SortMergeJoin 需要对数据进行 RangePartition 处理

如果你的数据帧 df1 和 df2 已经由键 k 上的 RangePartitioner 分区(也用于连接),那么就不会有额外的交换,否则会有。

 类似资料:
  • 我正在尝试在时间戳上连接来自两个表A和B的数据。理想情况下,我希望tableA的每一行都符合unitCode和时间限制,如果tableB中有关联的行,则将其连接,否则假设表B中的颜色已附加,但为空或空。 假设TableA看起来像这样: id |时间戳|项目1 |项目2 |项目3 表B看起来像这样: 同上|时间戳|项目 B1 |项目 B2 因此,数据可能如下所示: 时间戳|itemA1|itemA2

  • 我需要在火花中连接2个表。但是我首先过滤掉第二个表的一部分,而不是完全连接2个表: 我想在这种情况下使用广播连接。 Spark有一个参数,用于定义广播连接的最大表大小:: 配置在执行联接时将广播到所有工作节点的表的最大大小(以字节为单位)。通过将该值设置为-1,可以禁用广播。请注意,当前统计信息仅支持已运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元

  • 我试图转置我的数据,以便它是每个键的元组列表,而不是数据列。 作为我的投入: 我希望将输出写入拼花文件: 作为输入,我有两组拼花地板数据。我阅读它们并将其作为数据帧加入。然后我将每一行映射到键值对,然后将每个键还原为元组的大列表。 这里PARTITION_SIZE只是我为每次运行设置的一个变量,用于将数据分割成该大小的块。所以,如果我输入100000,并且有200万记录,那么编号为0-99,999

  • 我正在尝试使用docker容器运行ELK stack。但我得到的错误是,kibana无法与elasticsearch建立联系。 这是我的docker comp的内容 我日志的内容。形态 我有elasticsearch容器和kibana容器上的卷曲,对我来说很好 curl localhost:9200/_cat/index?漂亮的 增加虚拟内存大小后 root@sfbp19:~/docking je

  • 问题内容: 首先,它开始下载前三层,其中 一层完成后,第四层尝试开始下载。现在的问题是,直到 剩下的两层都完成了下载过程,它才会开始,并且在那之前 发生(我认为),第四层无法开始下载并中止 整个过程。所以我在想,如果一层一层地下载将 解决此问题。或者,也许是一种解决此问题的更好方法/选项, 当您没有非常快的Internet速度时,可能会发生这种情况。 问题答案: Docker守护程序具有一个–ma

  • 我试图通过Jedis客户端连接到redis服务器,但在连接时我得到了以下异常和堆栈跟踪- redisconnectionFailureException:无法获得Jedis连接;嵌套异常是redis.clients.jedis.exceptions.jedisconnectionException:无法从位于org.springframework.data.redis.connection.jed