tutorial spark read example español apache-spark jdbc apache-spark-sql

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 y upperBound 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 entre lowerBound y upperBound se divide en numPartitions 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).