什么是partitionColumn,下界,上界,numPartitions参数的含义是什么?

问题描述 投票:22回答:4

虽然通过在星火JDBC连接获取来自SQL Server的数据,我发现我可以设置一些并行的参数,如partitionColumnlowerBoundupperBoundnumPartitions。我已经通过了spark documentation但无法理解它。

谁能给我解释一下这些参数的含义?

apache-spark jdbc apache-spark-sql
4个回答
23
投票

很简单:

  • partitionColumn是应该被用来确定分区的列。
  • lowerBoundupperBound确定值的范围要被取出。完整的数据集将使用与下面的查询行: SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
  • numPartitions确定要创建的分区的数目。 lowerBoundupperBound之间范围被划分为numPartitions每个步幅等于: upperBound / numPartitions - lowerBound / numPartitions 例如,如果: lowerBound:0 upperBound:1000 numPartitions:10 步幅等于100和分区对应于以下查询: SELECT * FROM table WHERE partitionColumn BETWEEN 0 AND 100 SELECT * FROM table WHERE partitionColumn BETWEEN 100 AND 200 ... SELECT * FROM table WHERE partitionColumn BETWEEN 900 AND 1000

12
投票

其实上面的列表中错过了几件事情,特别是第一个和最后查询。

没有他们,你会宽松一些数据(lowerBound之前的数据和upperBound后)。从该示例并不清楚,因为下限为0。

完整的名单应该是:

SELECT * FROM table WHERE partitionColumn < 100

SELECT * FROM table WHERE partitionColumn BETWEEN 0 AND 100  
SELECT * FROM table WHERE partitionColumn BETWEEN 100 AND 200  

...

SELECT * FROM table WHERE partitionColumn > 9000

7
投票

创建分区不会导致由于过滤数据的丢失。该upperBound,与lowerbound沿numPartitions只定义分区如何被创建。的upperBoundlowerbound没有定义的范围(过滤器)用于partitionColumn的值要被取出。

For a given input of lowerBound (l), upperBound (u) and numPartitions (n) 
The partitions are created as follows:

stride, s= (u-l)/n

**SELECT * FROM table WHERE partitionColumn < l+s or partitionColumn is null**
SELECT * FROM table WHERE partitionColumn >= l+s AND <2s  
SELECT * FROM table WHERE partitionColumn >= l+2s AND <3s
...
**SELECT * FROM table WHERE partitionColumn >= l+(n-1)s**

例如,对于upperBound = 500lowerBound = 0numPartitions = 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的值的实际范围内,每个分区的结果大小会有所不同。


5
投票

只是想自言要添加到验证答案,

没有他们,你会失去一些数据是误导性的..

从文档,请注意,下界和上界只是用来决定分区步幅,而不是在表中过滤行。因此,在表中的所有行会被分割并返回。此选项仅适用于阅读。

这意味着说你的表有1100行,您指定

lowerBound 0

upperBound 1000

numPartitions:10,你不会失去的1000年至1100年行。你会刚刚结束了与一些比预期反而更行的分区。(步幅值是100)。

© www.soinside.com 2019 - 2024. All rights reserved.