Что означают параметры 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 размер результата каждого раздела будет отличаться.