Considere el siguiente programa como ejemplo mínimo reproducible -MRE :
import pandas as pd import pyarrow from pyarrow import parquet def foo(): print(pyarrow.__file__) print('version:',pyarrow.cpp_version) print('-----------------------------------------------------') df = pd.DataFrame({'A': [1,2,3], 'B':['dummy']*3}) print('Orignal DataFrame:\n', df) print('-----------------------------------------------------') _table = pyarrow.Table.from_pandas(df) parquet.write_table(_table, 'foo') _table = parquet.read_table('foo', columns=[]) #passing empty list to columns arg df = _table.to_pandas() print('After reading from file with columns=[]:\n', df) print('-----------------------------------------------------') print('Not passing [] to columns parameter') _table = parquet.read_table('foo') #Not passing any list df = _table.to_pandas() print(df) print('-----------------------------------------------------') x = input('press any key to exit: ') if __name__=='__main__': foo() Cuando lo ejecuto desde la consola/IDE, lee todos los datos de las columns=[] :
(env) D:\foo>python foo.py D:\foo\env\lib\site-packages\pyarrow\__init__.py version: 3.0.0 ----------------------------------------------------- Orignal DataFrame: AB 0 1 dummy 1 2 dummy 2 3 dummy ----------------------------------------------------- After reading from file with columns=[]: AB 0 1 dummy 1 2 dummy 2 3 dummy ----------------------------------------------------- Not passing [] to columns parameter AB 0 1 dummy 1 2 dummy 2 3 dummy ----------------------------------------------------- press any key to exit: Pero cuando lo ejecuto desde el ejecutable creado con Pyinstaller, no lee datos para las columns=[] :
E:\foo\dist\foo\pyarrow\__init__.pyc version: 3.0.0 ----------------------------------------------------- Orignal DataFrame: AB 0 1 dummy 1 2 dummy 2 3 dummy ----------------------------------------------------- After reading from file with columns=[]: Empty DataFrame Columns: [] Index: [0, 1, 2] ----------------------------------------------------- Not passing [] to columns parameter AB 0 1 dummy 1 2 dummy 2 3 dummy ----------------------------------------------------- press any key to exit: Como puede ver, pasar las columns=[] da un marco de datos vacío en el archivo ejecutable, pero este comportamiento no está allí mientras se ejecuta el archivo python directamente, y no estoy seguro de por qué hay dos comportamientos diferentes para el mismo código en el mismo entorno.
Mirando la cadena de documentación de parquet.read_table en el código fuente en GitHub :
columns: list
Si no es Ninguno, solo se leerán estas columnas del archivo. Un nombre de columna puede ser un prefijo de un campo anidado, por ejemplo, 'a' seleccionará 'a.b', 'a.c' y 'ade'.
read_table llama además a dataset.read que llama a _dataset.to_table que devuelve la llamada a self.scanner que luego devuelve la llamada al método estático from_dataset de la clase Scanner .
En todas partes, None se ha utilizado como valor predeterminado para el parámetro de columns , si None y [] se convierten directamente a Boolean en python, ambos serán False , pero si [] se compara con None , entonces será False , pero no se menciona en ninguna parte si debe obtener todas las columnas para las columns=[] porque se evalúa como False para el valor booleano, o si no debe leer ninguna columna ya que la lista está vacía.
Pero, ¿por qué el comportamiento es diferente al ejecutarlo desde la línea de comandos/IDE que al ejecutarlo desde el ejecutable creado con Pyinstaller para la misma versión de Pyarrow?
El entorno en el que estoy:
Aquí está el archivo de especificaciones para su referencia si desea probarlo ( debe cambiar el parámetro pathex ):
foo.spec
# -*- mode: python ; coding: utf-8 -*- import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5) block_cipher = None a = Analysis(['foo.py'], pathex=['D:\\foo'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='foo', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='foo')La documentación de pyarrow para pyarrow.parquet.read_table probablemente no esté clara. He planteado FLECHA-13436 para aclarar esto.
Según algunas pruebas, parece que el comportamiento cambió en algún momento de ninguna columna a todas las columnas y luego volvió a cambiar (en 4.0) a ninguna columna. Creo que ninguna columna es el comportamiento correcto.
Entonces, supongo que su ejecutable está usando una versión diferente de pyarrow que su IDE. Por lo general, puede confirmar esto ejecutando...
import pyarrow print(pyarrow.__file__) print(pyarrow.cpp_version)...en ambos entornos y luego comparar los resultados.
La razón es que cuando lo ejecutó en el IDE, lo ejecutó dentro de un entorno, mientras que cuando lo ejecutó en la línea de comandos, estaba fuera del entorno. Y los archivos DLL eran diferentes. Entonces, la solución fue copiar el paquete pyarrow fuera del entorno y dio el mismo resultado.