虽然通过在星火JDBC连接获取来自SQL Server的数据,我发现我可以设置一些并行的参数,如partitionColumn
,lowerBound
,upperBound
和numPartitions
。我已经通过了spark documentation但无法理解它。
谁能给我解释一下这些参数的含义?
很简单:
partitionColumn
是应该被用来确定分区的列。lowerBound
和upperBound
确定值的范围要被取出。完整的数据集将使用与下面的查询行:
SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
numPartitions
确定要创建的分区的数目。 lowerBound
和upperBound
之间范围被划分为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
其实上面的列表中错过了几件事情,特别是第一个和最后查询。
没有他们,你会宽松一些数据(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
创建分区不会导致由于过滤数据的丢失。该upperBound
,与lowerbound
沿numPartitions
只定义分区如何被创建。的upperBound
和lowerbound
没有定义的范围(过滤器)用于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 = 500
,lowerBound = 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
的值的实际范围内,每个分区的结果大小会有所不同。
只是想自言要添加到验证答案,
没有他们,你会失去一些数据是误导性的..
从文档,请注意,下界和上界只是用来决定分区步幅,而不是在表中过滤行。因此,在表中的所有行会被分割并返回。此选项仅适用于阅读。
这意味着说你的表有1100行,您指定
lowerBound
0
upperBound
1000
numPartitions
:10,你不会失去的1000年至1100年行。你会刚刚结束了与一些比预期反而更行的分区。(步幅值是100)。