Apache spark SparkSQL:如何在从数据库加载数据集时指定分区列

Apache spark SparkSQL:如何在从数据库加载数据集时指定分区列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我使用Spark 2.3,并使用jdbc从MySQL加载数据,如下所示 val dataSet:Dataset[Row] = _spark .read .format("jdbc") .options(Map("url" -> jdbcUrl ,"user" -> username ,"password" -> password ,"dbtable" -&

我使用Spark 2.3,并使用jdbc从MySQL加载数据,如下所示

  val dataSet:Dataset[Row] = _spark
    .read
    .format("jdbc")
    .options(Map("url" -> jdbcUrl
                ,"user" -> username
                ,"password" -> password
                ,"dbtable" -> dataSourceTableName
                ,"driver" -> driver
                ))
    .load() 
我想根据表中的特定列对数据集进行分区。
如何实现这一点?

您需要指定
分区列
上限
下限
多个分区
选项

这些在中的属性表中进行了描述

如果指定了任何选项,则必须全部指定这些选项。在里面 此外,必须指定
numPartitions
。它们描述了如何 从多个工作线程并行读取时对表进行分区。 partitionColumn必须是来自 有问题的桌子。请注意,
lowerBound
upperBound
仅用于 决定分区步长,而不是筛选表中的行。 因此,表中的所有行都将被分区并返回。此选项 只适用于阅读

有关
上限
下限
参数的进一步解释,请参见@PIYUSH PASARI's

他给出了以下使用以下参数值生成的查询示例

上限=500
下限=0
numPartitions=5

SELECT * FROM table WHERE partitionColumn < 100 or partitionColumn is null
SELECT * FROM table WHERE partitionColumn >= 100 AND <200 
SELECT * FROM table WHERE partitionColumn >= 200 AND <300
SELECT * FROM table WHERE partitionColumn >= 300 AND <400
...
SELECT * FROM table WHERE partitionColumn >= 400
从partitionColumn<100或partitionColumn为空的表中选择*
从表格中选择*,其中partitionColumn>=100且=200且=300且=400
这可以从中的代码中看到

正如您所看到的,所有的行都被获取,但是如果您的上限和下限没有覆盖整个数据范围,那么第一个和最后一个分区可能会比其他分区大。如果您不能确定上界和下界,您想要甚至分割,并且不关心获取每一行,那么您可以始终将上界和下界设置为
dbtable
参数中的条件

spark.read("jdbc")
  .option("url", url)
  .option("dbtable", "pets")
  .option("user", user)
  .option("password", password)
  .option("numPartitions", 10)
  .option("partitionColumn", "owner_id")
  .option("lowerBound", 1)
  .option("upperBound", 10000)
阅读以下链接的更多内容


谢谢,有没有办法避免给出“上界和下界”,而只给出partitionColumn无需指定每个参数。它们仅用于指定每个分区的步幅长度。将返回所有行,但如果边界不正确,则第一个和最后一个分区可能比其他分区大。如果需要偶数分区,并且只需要给定范围内的结果,则还应在查询中设置上限和下限。