【问题标题】:Spark DataFrame RangePartitionerSpark 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 的一个分区,以及它如何将这两个分区发送(如果有的话)到同一台机器进行加工。

【问题讨论】:

    标签: apache-spark apache-spark-sql apache-spark-dataset


    【解决方案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 中的新功能
    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2017-10-18
    • 2016-11-24
    相关资源
    最近更新 更多