JDBC 到 Spark Dataframe - 如何确保均匀分区?

Joe*_*jr2 6 partitioning jdbc apache-spark apache-spark-sql

我是 Spark 的新手,正在通过 JDBC 从 Postgres 数据库表创建一个 DataFrame,使用spark.read.jdbc.

我对分区选项有些困惑,特别是partitionColumnlowerBoundupperBoundnumPartitions


  • 文档似乎表明这些字段是可选的。如果我不提供它们会怎样?
  • Spark 如何知道如何对查询进行分区?那会有多高效?
  • 如果我确实指定了这些选项,即使 partitionColumn 分布不均匀,我如何确保分区大小大致相同?

假设我将有 20 个执行程序,所以我将 numPartitions 设置为 20。
我的 partitionColumn 是一个自动递增的 ID 字段,假设值范围从 1 到 2,000,000
但是,因为用户选择处理一些非常旧的数据,连同一些真正的新数据,中间没有任何内容,大多数数据的 ID 值要么低于 100,000,要么超过 1,900,000。

  • 我的第 1 位和第 20 位执行者会得到大部分工作,而其他 18 位执行者则大部分时间都坐在那里闲置吗?

  • 如果是这样,有没有办法防止这种情况?

Joe*_*jr2 5

我找到了一种手动指定分区边界的方法,即使用带有谓词参数的 jdbc 构造函数

它允许您显式指定要插入每个分区的“where”子句中的各个条件,从而允许您准确指定每个分区将接收的行范围。因此,如果您没有用于自动分区的均匀分布列,您可以自定义自己的分区策略。

有关如何使用它的示例可以在该问题的已接受答案中找到。