首页 > 解决方案 > Spark DataFrame RangePartitioner

问题描述

[Spark 新手] 语言 - Scala

根据文档, RangePartitioner 将元素分类并划分为块并将这些块分发到不同的机器。下面的示例将如何工作。

假设我们有一个包含 2 列的数据框,其中一列(例如“A”)具有从 1 到 1000 的连续值。还有另一个具有相同模式的数据框,但对应的列只有 4 个值 30、250、500、900。(这些可以是任何值,从 1 到 1000 中随机选择)

如果我使用 RangePartitioner 进行分区,

df_a.partitionByRange($"A")
df_b.partitionByRange($"A")

来自两个数据帧的数据将如何跨节点分布?

假设分区数为 5。

另外,如果我知道第二个 DataFrame 的值数量较少,那么减少它的分区数量会有所不同吗?

我正在努力理解的是,Spark 如何将 df_a 的一个分区映射到df_b的一个分区,以及它如何将这两个分区(如果有的话)发送到同一台机器进行处理。

标签: apache-sparkapache-spark-sqlapache-spark-dataset

解决方案


此处描述了RangePartitioner有关内部工作原理的非常详细的说明

针对您的问题,在运行时RangePartitioner对 RDD 进行采样 ,收集统计信息,然后才评估范围(限制)。请注意,这里有 2 个参数 - 范围(逻辑)和分区(物理)。分区的数量可能受许多因素的影响 - 输入文件的数量、从父 RDD 继承的数量、'spark.sql.shuffle.partitions' 在洗牌的情况下等。 根据采样评估的范围。无论如何,RangePartitioner 确保每个范围都包含在单个分区中。

来自两个数据帧的数据将如何跨节点分布?Spark 如何将 df_a 的一个分区映射到 df_b 的一个分区

我假设您隐含的意思是加入“A”和“B”,否则这个问题没有任何意义。在这种情况下,Spark 会根据他们的统计数据确保将分区与两个 DataFrame 上的范围相匹配。


推荐阅读