Featured image of post Haz que Excel PowerQuery/PowerBI vuele con DuckDB

Haz que Excel PowerQuery/PowerBI vuele con DuckDB

Lee gigabytes de archivos CSV a una velocidad absurdamente rápida en Power Query gracias a DuckDB

En mi entrada anterior, hablé sobre DuckDB. Para ser conciso, omití un truco muy interesante: su ventaja en rendimiento también se puede integrar en Excel y Power BI.

Pero primero, una nota sobre la lectura de archivos CSV con DuckDB

En mi artículo anterior, olvidé por completo mencionar una limitación con la que me encontré al leer archivos CSV con DuckDB: solo admite la codificación UTF-8. Si tus archivos utilizan CP-1252 (común en las aplicaciones de Windows si las utilizas en español), primero tendrás que convertirlos externamente. Aunque la función read_csv() de DuckDB incluye la opción encoding=“latin-1”, no me funcionó en este caso.

Hacer que Power Query lea gigabytes a una velocidad ridículamente rápida

Una vez aclarado esto, vamos a poner el “Power” en Power Query combinándolo con DuckDB para cargar archivos CSV mucho más rápido y poder leer archivos Parquet. La mayoría probablemente querréis utilizarlo con PowerBI a través del conector DuckDB, pero en este caso yo voy a utilizar Excel solo con el controlador ODBC, porque me resulta más hilarante.

La instalación es sencilla: se descarga el controlador ODBC para DuckDB y se extrae el archivo ZIP en una carpeta, se coloca en un lugar “sencillo” como el directorio C:\ y se ejecuta el archivo odbc_install.exe. Una vez hecho esto, se creará un DSN del sistema para DuckDB, que apuntará a la base de datos temporal en memoria. Ten en cuenta que esto solo funciona en modo de 64 bits, por lo que necesitarás una versión de 64 bits de Microsoft Office para que funcione.

Antes de empezar con la locura, hagamos una prueba con el lector CSV integrado en Power Query. Utilizaré uno de los archivos del conjunto de datos que utilicé en mi artículo anterior , con 5.689.513 líneas:

let
    Origen = Csv.Document(File.Contents("C:/Users/Edu/Documents/eduardo-tests/common/flight-status-prediction-rob-mulla/Combined_Flights_2018.csv"),[Delimiter=",", Columns=61, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    [...]
    #"Filas agrupadas" = Table.Group(#"Tipo cambiado", {"Airline"}, {{"Time Lost", each List.Sum([ArrDelay]), type nullable number}, {"Flights", each Table.RowCount(_), Int64.Type}})
in
    #"Filas agrupadas"

A diferencia de simplemente cargar el archivo sin pasos adicionales, lo que tarda unos 15 minutos en cargarse por completo antes de que finalmente se produzca un error por exceder el límite de filas de Excel; curiosamente al insertar un paso «Agrupar por», carga en 3 minutos y 50 segundos.

Conexión nativa Power Query CSV

Esto sugiere que Excel realiza algún tipo de optimización para la consulta entera. Aun así, es lamentablemente lento, especialmente teniendo en cuenta que el ineficiente pd.read_csv() de Pandas, del que me quejé en mi artículo anterior, logró cargar el mismo archivo en solo 57 segundos.

Está claro que Excel no gana ningún concurso de velocidad, así que vamos a ayudarle con DuckDB. Para hacerlo en Excel, vamos a Datos > Obtener datos > De otras fuentes > De ODBC.

Cómo llegar a “De ODBC”

En la ventana que aparece, seleccionamos el DSN de DuckDB y expandimos la sección Opciones avanzadas. En Instrucción SQL (opcional), introducimos el comando de DuckDB para cargar los archivos CSV. En mi caso:

SELECT Airline, sum(ArrDelay)"Time Lost", count(Airline)"Flights", count(DISTINCT FlightDate)"Days Operated"
FROM read_csv("C:/Users/Edu/Documents/eduardo-tests/common/flight-status-prediction-rob-mulla/Combined_Flights_2018.csv")
GROUP BY Airline
ORDER BY Airline

Y entonces hacemos click en Aceptar.

La ventana “De ODBC” de acabar viéndose tal que así

La primera vez que lo hagas, aparecerá una ventana solicitando credenciales, simplemente ignórala haciendo clic en Conectar.

La ventana de credenciales

Ahora, cuando cargo los datos, solo tarda… ¡10 segundos! Casi se me saltan las lágrimas. El lector CSV nativo de Power Query no puede ni soñar con esa velocidad.

Conexión Power Query de ODBC/DuckDB

Y recuerda, esa no es la única ventaja. Con DuckDB, también obtienes la capacidad de leer archivos Parquet e incluso bases de datos DuckDB directamente. Un pequeño truco: cuando trabajas con bases de datos DuckDB, no es necesario crear un nuevo DSN de usuario para cada una de ellas. En la ventana De ODBC con el DSN de DuckDB seleccionado, en Cadena de conexión, escribe la opción database=C:\path\to\database.duckdb con la ruta a tu base de datos.

Lo dejo aquí para que sigáis experimentando por vuestra cuenta. Por ahora, esta será mi última publicación relacionada con DuckDB… o tal vez no. Ya veremos.

Creado con Hugo
Tema Stack diseñado por Jimmy