Omisión de archivos para las tablas Delta

Omitir archivos es una optimización de lectura de Delta Lake que permite al motor Spark evitar analizar archivos de datos que no pueden contener filas que coincidan. Dado que el motor lee menos datos, las consultas se ejecutan más rápido y consumen menos recursos de E/S.

Funcionamiento de la omisión de archivos

Cada vez que se escribe un archivo de datos en una tabla Delta, Delta Lake registra estadísticas de columnas por archivo en el registro de transacciones. Estas estadísticas incluyen el valor mínimo, el valor máximo y el recuento nulo para cada columna indizada de ese archivo.

Cuando una consulta incluye un predicado de filtro, el motor compara el valor del predicado con el intervalo mínimo/máximo almacenado para cada archivo. Si el valor del predicado está fuera del intervalo de un archivo, ese archivo se omite completamente, no es necesario abrirlo ni examinarlo.

Por ejemplo, considere una sales tabla con particiones en cinco archivos de datos por intervalos de fechas:

Archivo Estadísticas mínimas/máximas Resultado de WHERE date = '2024-03-15'
Archivo 1 date [2024-01-01 .. 2024-02-28] Omitido
Archivo 2 date [2024-03-01 .. 2024-03-31] Leer ✓
Archivo 3 date [2024-04-01 .. 2024-05-31] Omitido
Archivo 4 date [2024-06-01 .. 2024-07-31] Omitido
Archivo 5 date [2024-08-01 .. 2024-09-30] Omitido

En este caso, se omiten cuatro de cinco archivos (80% menos datos examinados), ya que sus intervalos mínimo/máximo no se superponen con el valor de filtro.

Importante

El tipo de datos del valor de predicado debe coincidir con el tipo de columna. Una incompatibilidad de tipos puede impedir que el motor use estadísticas a nivel de archivo para omitir datos.

Comportamiento predeterminado

Delta Lake recopila estadísticas de archivos automáticamente con los valores predeterminados siguientes:

  • Solo las primeras 32 columnas (por posición ordinal) tienen estadísticas recopiladas.
  • Estadísticas de las que se realiza un seguimiento por columna por archivo: recuento mínimo, máximo y nulo
  • La recopilación de estadísticas en columnas de cadena largas es costosa y agrega sobrecarga de escritura, por lo que el posicionamiento es importante.

La propiedad delta.dataSkippingNumIndexedCols de tabla controla el límite de columnas. Las columnas que superan ese umbral no disponen de estadísticas a nivel de archivo y no pueden beneficiarse de la omisión de archivos.

Tipos de datos aptos

No todos los tipos de columna admiten estadísticas de nivel de archivo y, por tanto, la omisión de archivos. El motor evalúa el tipo de datos de cada columna para determinar si se pueden recopilar estadísticas mínimas o máximas.

Siempre admisible (tipos atómicos)

  • NumericType(ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, ) DecimalType
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

Apto condicionalmente

Note

Los siguientes tipos se pueden habilitar a partir de Fabric Spark Runtime 2.0 (Delta 4.1)

  • VariantType: cuando spark.databricks.delta.variantShredding.collectVariantDataSkippingStats está habilitado.
  • ArrayType: cuando spark.microsoft.delta.skipping.complexTypes.enabled está habilitado y el tipo de elemento es apto.
  • MapType: cuando spark.microsoft.delta.skipping.complexTypes.enabled está habilitado y los tipos de clave y valor son aptos.

No elegible

  • BinaryType
  • BooleanType
  • StructType (en su conjunto: los campos hoja dentro de las estructuras se evalúan individualmente)
  • NullType

Maximizar la cobertura de columnas

Para sacar el máximo provecho del salto de archivos, asegúrese de que las columnas por las que filtra con más frecuencia estén incluidas en las estadísticas de los archivos.

Colocar primero las columnas filtradas con frecuencia

Coloque las columnas que aparecen con más frecuencia en cláusulas WHERE, claves de unión y predicados de filtrado en las primeras 32 posiciones ordinales del esquema de la tabla. Mueva las columnas de cadenas largas o las columnas de baja selectividad más allá de la posición 32 para evitar el sobrecoste de escritura asociado a estadísticas que rara vez resultan útiles.

ALTER TABLE table_name ALTER COLUMN long_str_col AFTER last_indexed_col

Aumentar el número de columnas indizadas

Si la tabla tiene más de 32 columnas que se benefician de las estadísticas, aumente el límite predeterminado:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingNumIndexedCols' = '40')

Note

Aumentar el número de columnas indexadas añade sobrecarga en la escritura para cada archivo de datos. Aumente este valor solo cuando las columnas adicionales se usen con frecuencia en predicados de filtro.

Especificación de columnas exactas para estadísticas

Use delta.dataSkippingStatsColumns para controlar explícitamente qué columnas obtienen estadísticas de archivo, independientemente de la posición ordinal:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingStatsColumns' = 'col1,col2')

Cuando delta.dataSkippingStatsColumns se establece, solo las columnas especificadas obtienen estadísticas recopiladas. Este enfoque proporciona un control específico sobre el equilibrio entre el costo de escritura y la ventaja de lectura.

Combine la omisión de archivos con la disposición de los datos

Omitir archivos funciona mejor cuando los valores relacionados están ubicados en los mismos archivos. Técnicas como ZORDER BY y agrupación en clústeres líquidos reorganizan físicamente los datos para que las filas con valores de columna similares terminen en los mismos archivos. La colocación de valores similares ajusta los intervalos min/max por archivo, lo que aumenta el porcentaje de archivos que el motor puede omitir para un filtro determinado.

Para obtener más información sobre la optimización del diseño de datos, consulte Compactación de tablas, Agrupación en clústeres líquidos y Orden Z.