Spark DataFrame RangePartitioner

Posted

技术标签:

【中文标题】Spark DataFrame RangePartitioner【英文标题】: 【发布时间】:2018-10-26 13:39:13 【问题描述】:

[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 的一个分区,以及它如何将这两个分区发送(如果有的话)到同一台机器进行加工。

【问题讨论】:

【参考方案1】:

RangePartitioner内部is described here如何工作的非常详细的解释

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

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

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

【讨论】:

partitionByRange 是否仅适用于 Scala?我在 pyspark 中找不到这种方法 @vikrantrana 2.4 中的新功能

以上是关于Spark DataFrame RangePartitioner的主要内容,如果未能解决你的问题,请参考以下文章

spark dataframe 怎么去除第一行数据

如何打印 spark dataframe

[Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:

Spark编程--Spark SQL DataFrame

[Spark][Python]spark 从 avro 文件获取 Dataframe 的例子

pandas dataframe 与 spark dataframe 互相转换(数据类型应该怎么转换呢?)