partitionColumn,lowerBound,upperBound,numPartitions参数是什么意思?

时间:2016-12-11 10:35:08

标签: apache-spark jdbc apache-spark-sql

在Spark中通过JDBC连接从SQL Server获取数据时,我发现我可以设置一些并行化参数,如partitionColumnlowerBoundupperBoundnumPartitions 。我已经完成spark documentation但是无法理解它。

有人能解释一下这些参数的含义吗?

4 个答案:

答案 0 :(得分:20)

很简单:

  • partitionColumn是一个应该用于确定分区的列。
  • lowerBoundupperBound确定要获取的值范围。完整数据集将使用与以下查询对应的行:

    SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
    
  • numPartitions确定要创建的分区数。 lowerBoundupperBound之间的范围分为numPartitions,每个步幅等于:

    upperBound / numPartitions - lowerBound / numPartitions
    

    例如:if:

    • lowerBound:0
    • upperBound:1000
    • numPartitions:10

    Stride等于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

答案 1 :(得分: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

答案 2 :(得分:6)

创建分区不会由于过滤而导致数据丢失。 upperBoundlowerboundnumPartitions一起定义了如何创建分区。 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的实际值范围,每个分区的结果大小将有所不同。

答案 3 :(得分:5)

自从单词

以来,只想添加到已验证的答案中

没有它们你会丢失一些数据会产生误导......

从文档中, 请注意,lowerBound和upperBound仅用于决定分区步幅,而不是用于过滤表中的行。因此,表中的所有行都将被分区并返回。此选项仅适用于阅读。

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

lowerBound 0

upperBound 1000和

numPartitions:10 ,你不会松开1000到1100行。您最终会得到一些分区的行数比预期的多。(步幅值为100)。