apache-spark - read - spark sql example
¿Cuál es el significado de los parámetros partitionColumn, lowerBound, upperBound, numPartitions? (4)
Al recuperar datos de SQL Server a través de una conexión JDBC en Spark, descubrí que puedo establecer algunos parámetros de paralelización como partitionColumn
, lowerBound
, upperBound
y numPartitions
. He pasado por la documentación de la chispa, pero no pude entenderlo.
¿Alguien puede explicarme los significados de estos parámetros?
En realidad, la lista anterior omite un par de cosas, específicamente la primera y la última consulta.
Sin ellos, perdería algunos datos (los datos antes del lowerBound
y después del upperBound
). Del ejemplo no queda claro porque el límite inferior es 0.
La lista completa debe ser:
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
Es simple:
-
partitionColumn
es una columna que se debe utilizar para determinar las particiones. lowerBound
yupperBound
determinan el rango de valores a recuperar. El conjunto de datos completo utilizará filas correspondientes a la siguiente consulta:SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
numPartitions
determina el número de particiones que se crearán. El rango entrelowerBound
yupperBound
se divide ennumPartitions
cada una con un paso igual a:upperBound / numPartitions - lowerBound / numPartitions
Por ejemplo si:
-
lowerBound
: 0 -
upperBound
: 1000 numPartitions
: 10
Stride es igual a 100 y las particiones corresponden a las siguientes consultas:
-
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
-
La creación de particiones no provoca la pérdida de datos debido al filtrado. The upperBound
, lowerbound
junto con numPartitions
simplemente define cómo se numPartitions
las particiones. El upperBound
y el lowerbound
no definen el rango (filtro) para los valores de partitionColumn que se van a buscar.
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**
Por ejemplo, para upperBound = 500
, lowerBound = 0
y numPartitions = 5
. Las particiones serán según las siguientes consultas:
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
Dependiendo del rango real de valores de partitionColumn
, el tamaño del resultado de cada partición variará.
Solo quisiera agregar a la respuesta verificada ya que las palabras,
Sin ellos perderías algunos datos es engañoso ..
De la documentación, observe que lowerBound y upperBound solo se usan para decidir el paso de la partición, no para filtrar las filas en la tabla. Así que todas las filas en la tabla serán particionadas y devueltas. Esta opción se aplica sólo a la lectura.
Lo que significa que su tabla tiene 1100 filas y usted especifica
lowerBound
0
upperBound
1000 y
numPartitions
: 10, no perderá las 1000 a 1100 filas. Simplemente terminará con algunas de las particiones que tienen más filas de las que pretendía en su lugar (el valor de paso es 100).