es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diferencias de rendimiento entre la filtración de una tabla, un escáner y fragmentos.

En un conjunto de datos grande con muchos archivos, ¿hay alguna diferencia al filtrar directamente un conjunto de datos a una tabla como esta?:

dataset.to_table(columns, filter=filter_expression)

¿Comparado con el uso de un escáner como este?:

dataset.scanner(columns, filter=filter_expression).to_table()

¿O fragmentos?:

fragments = dataset.get_fragments(filter=filter_expression)
new = ds.dataset(fragments)

También observo que tanto los escáneres como los conjuntos de datos tienen un método .take. ¿Supongo que siempre es mejor usar el filtrado a nivel de fila con una expresión de filtro en lugar de usar .take, correcto? ¿O hay algún caso de uso que me esté perdiendo?

Cualquier consejo sobre las mejores prácticas sería apreciado. Mis casos de uso más comunes son el filtrado de particiones simples, pero también el filtrado por un cierto ID que podría existir en cualquier partición (por ejemplo, podría necesitar todos los registros de un cierto ID en los últimos 2 años).

Tags:  

Answer

  1. Avatar for davy.ai

    Cuando se trabaja con un gran conjunto de datos con muchos archivos, puede haber una diferencia significativa en el rendimiento al filtrar un conjunto de datos directamente a una tabla en comparación con el uso de un escáner o fragmentos.

    Usar dataset.to_table (columnas, filter = filter_expression) cargará todo el conjunto de datos en la memoria y luego aplicará el filtro. Esto puede ser lento y consumir mucha memoria, especialmente para conjuntos de datos grandes.

    El uso de un escáner como dataset.scanner (columnas, filter = filter_expression) .to_table () o fragmentos como fragments = dataset.get_fragments (filter = filter_expression) new = ds.dataset (fragments) puede ser más eficiente porque permiten la carga y filtrado perezosos de los datos.

    En cuanto al método .take (), en general es mejor usar un filtrado a nivel de fila con una expresión de filtro en lugar de usar .take (). Esto se debe a que .take () cargará todo el conjunto de datos en la memoria antes de aplicar el filtro, lo que puede ser lento y consumir mucha memoria.

    En términos de mejores prácticas, se recomienda usar la carga y filtrado perezosos siempre que sea posible, como usar escáneres o fragmentos. Además, el uso de particiones puede ayudar a mejorar el rendimiento y la escalabilidad.

    Para su caso de uso de filtrado para un ID específico en múltiples particiones, puede usar la expresión de filtro para apuntar solo a las particiones relevantes. Esto se puede hacer especificando la clave y el valor de la partición en la expresión de filtro. Por ejemplo, filter_expression = (pa.field ('my_partition_key') == 'my_partition_value') & (pa.field ('id') == 'my_id_value') filtraría solo para el ID especificado en la partición con una clave de ‘mi_clave_de_partición’ y un valor de ‘mi_valor_de_partición’.

Comments are closed.