当前位置: 首页 > 知识库问答 >
问题:

Spark:read.jdbc中numPartitions之间的区别(..numPartitions..)和重新分区(..numpartitions..)

管景天
2023-03-14

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

  1. dataframereader.jdbc
  2. dataset.repartition

dataframereader.jdbc的官方文档对numpartitions参数有以下说明

NumPartitions:分区的数量。这与lowerBound(包括)、upperBound(独占)一起,构成了用于平均拆分列columnName的生成WHERE子句表达式的分区步长。

dataset.repartition的官方文档

    dataframereader.jdbc方法中的 numpartition参数控制从数据库读取数据的并行度
  1. dataset.repartition中的numpartition参数控制将此dataframe
  2. 写入磁盘时生成的输出文件数

我的问题:

  • 如果我通过dataframeReader.jdbc读取dataframe,然后将其写入磁盘(不调用repartition方法),那么在调用repartition后将dataframe写入磁盘的dataframe时,输出中的文件还会像调用repartition时那样多吗?
  • 如果上述问题的答案是:
      numpartitions是:那么在使用 dataframereader.jdbc方法(带有 numpartitions参数)读取的 dataframe方法上调用 repartition方法是否多余?
    • 不:那么请纠正我理解上的错误。另外,在这种情况下,dataframereader.jdbc方法的numpartitions参数不应该被称为类似于“parallelism”吗?

共有1个答案

万俟穆冉
2023-03-14

简而言之:这两种方法中numpartitions参数的行为(几乎)没有区别

read.jdbc(...numpartitions..)

这里,NumPartitions参数控制:

    null

回答确切的问题:

如果我通过dataframereader.jdbc读取DataFrame,然后将其写入磁盘(不调用repartition方法),那么在调用了repartition之后,输出中的文件是否仍然与将DataFrame写入磁盘时的文件数量一样多?

是的

除非调用repartition方法的其他变体(接受columnexprsparam的变体),否则对这样的dataframe参数调用repartition(numpartitions)是多余的。但是,我不确定在已经并行化的dataframe上强制相同程度的并行是否也会不必要地调用执行器之间的数据洗牌。一旦我遇到答案就会更新。

 类似资料:
  • 我在这里浏览了文档:https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html 它说: 重新分区:生成的DataFrame是哈希分区的 对于repartitionByRange:结果DataFrame是范围分区的 而且之前的一个问题也提到了。然而,我仍然不明白它们到底有什么不同,当选择一个而不是另一个时会有什么

  • 本文向大家介绍分页和细分之间的区别,包括了分页和细分之间的区别的使用技巧和注意事项,需要的朋友参考一下 分页 分页是一种内存管理技术,其中,进程地址空间被分成大小相同的块,称为页面(大小为2的幂,介于512字节和8192字节之间)。进程的大小以页数为单位。类似地,将主存储器划分为称为帧的(物理)存储器的固定小块,并且将帧的大小与页面的大小保持相同,以最佳利用主存储器并避免外部碎片。 类似地,将主存

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。

  • 问题内容: 我有两个问题,可能需要一些帮助来理解它们。 和之间有什么区别?我知道这 意味着在单独的外壳中运行命令,然后将其传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。 如果我们可以使用并且效果很好,那我为什么不能使用它呢?两者的执行周期有何不同? 问题答案: 语法是令牌级别的,因此美元符号的含义取决于其所在的令牌。表达式是现代代名词,代表命令替换;这意味着运行并将其输出放在此处。