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][Python]Spark 访问 mysql , 生成 dataframe 的例子: