Что означают параметры partitionColumn, lowerBound, upperBound, numPartitions?
При получении данных с SQL Server через соединение JDBC в Spark я обнаружил, что могу установить некоторые параметры распараллеливания, такие как partitionColumn
, lowerBound
, upperBound
и numPartitions
. Я прошел искровую документацию, но не смог ее понять.
Может кто-нибудь объяснить мне значения этих параметров?
Ответы
Ответ 1
Это просто:
-
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
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
Ответ 2
Фактически в приведенном выше списке отсутствует несколько вещей, в частности первый и последний запрос.
Без них вы потеряете некоторые данные (данные перед 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
Ответ 3
Просто хотел бы добавить к проверенному ответу, поскольку слова,
Без них вы потеряете некоторые данные, вводят в заблуждение.
Обратите внимание, что lowerBound и upperBound используются только для выбора шага раздела, а не для фильтрации строк в таблице. Таким образом, все строки в таблице будут разделены и возвращены. Этот параметр применяется только к чтению.
Это означает, что ваша таблица имеет 1100 строк, и вы указываете
lowerBound
0
upperBound
1000 и
numPartitions
: 10, вы не потеряете 1000 до 1100 строк. Вы просто закончите тем, что некоторые из разделов имеют больше строк, чем предполагалось (значение stride равно 100).
Ответ 4
Создание разделов не приводит к потере данных из-за фильтрации. upperBound
, lowerbound
с numPartitions
определяет только то, как должны быть созданы разделы. upperBound
и lowerbound
не определяют диапазон (фильтр) для значений, которые нужно 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
размер результата каждого раздела будет отличаться.