gpt4 book ai didi

apache-spark - Spark : Difference between numPartitions in read. jdbc(..numPartitions..) 和 repartition(..numPartitions..)

转载 作者:行者123 更新时间:2023-12-03 13:51:32 25 4
gpt4 key购买 nike

我对 numPartitions 的行为感到困惑以下方法中的参数:

  • DataFrameReader.jdbc
  • Dataset.repartition

  • official docsDataFrameReader.jdbc说以下关于 numPartitions范围

    numPartitions: the number of partitions. This, along with lowerBound (inclusive), upperBound (exclusive), form partition strides for generated WHERE clause expressions used to split the column columnName evenly.



    official docsDataset.repartition

    Returns a new Dataset that has exactly numPartitions partitions.



    我目前的理解:
  • numPartition DataFrameReader.jdbc 中的参数方法控制从数据库读取数据的并行度
  • numPartition Dataset.repartition 中的参数控制此 DataFrame 时将生成的输出文件的数量将写入磁盘


  • 我的问题:
  • 如果我读了 DataFrame通过 DataFrameReader.jdbc然后将其写入磁盘(不调用 repartition 方法),那么输出中的文件是否仍然与我写出 DataFrame 时一样多调用后写入磁盘 repartition在上面?
  • 如果以上问题的答案是:
  • 是的:那么调用 repartition 是多余的吗? DataFrame 上的方法使用 DataFrameReader.jdbc 读取的方法(带有 numPartitions 参数)?
  • 否:那么请纠正我的理解错误。同样在这种情况下不应该是 numPartitions DataFrameReader.jdbc的参数方法被称为“并行”之类的东西?
  • 最佳答案

    简短回答:有(几乎)没有区别numPartitions 的行为中两种方法中的参数

    read.jdbc(..numPartitions..)

    在这里,numPartitions参数控制:

  • 并联连接数这将用于 MySQL (或任何其他 RDBM)用于读取数据 进入 DataFrame .
  • 平行度读取 DataFrame 上的所有后续操作包括写入磁盘 直到 repartition方法在其上被调用


  • repartition(..numPartitions..)

    这里 numPartitions参数控制 平行度将在 展出执行任何操作 DataFrame ,包括 写入磁盘 .

    所以基本上是 DataFrame阅读获得 MySQL表使用 spark.read.jdbc(..numPartitions..)方法的行为相同(在对其执行的操作中表现出相同程度的并行性),就好像它是在没有并行性的情况下读取的,并且 repartition(..numPartitions..)之后调用了方法(显然具有相同的值 numPartitions )

    要回答确切的问题:

    If I read DataFrame via DataFrameReader.jdbc and then write it to disk (without invoking repartition method), then would there still be as many files in output as there would've been had I written out a DataFrame to disk after having invoked repartition on it?



    是的

    假设读取任务已经通过提供适当的参数( columnNamelowerBoundupperBoundnumPartitions )进行了并行化,所有对结果 DataFrame 的操作 包括写将并行执行。引用 official docs这里:

    numPartitions: The maximum number of partitions that can be used for parallelism in table reading and writing. This also determines the maximum number of concurrent JDBC connections. If the number of partitions to write exceeds this limit, we decrease it to this limit by calling coalesce(numPartitions) before writing.



    Yes: Then is it redundant to invoke repartition method on a DataFrame that was read using DataFrameReader.jdbc method (with numPartitions parameter)?



    是的

    除非您调用 repartition 的其他变体方法(采用 columnExprs 参数的方法),调用 repartition就这样 DataFrame (具有相同的 numPartitions )参数是多余的。但是,我不确定是否在已经并行化的 DataFrame 上强制执行相同程度的并行性还调用 洗牌 executors之间的数据不必要地。一旦我遇到它会更新答案。

    关于apache-spark - Spark : Difference between numPartitions in read. jdbc(..numPartitions..) 和 repartition(..numPartitions..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48276241/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com