我正在尝试在 VS Code 中运行的 Jupyter 笔记本中使用 DuckDB 读取大型 Parquet 文件。我的目标是直接从 Parquet 文件查询数据的子集,而不将整个数据集加载到内存中,因为我的系统 RAM 有限。然而,DuckDB 不断抛出
IOException
,尽管文件路径是正确的并且可以通过 pandas
读取。
这是我尝试查询 Parquet 文件子集的基本代码:
import duckdb
# Querying a subset of the Parquet file
query = """
SELECT *
FROM '../Data/train.parquet'
WHERE date_id <= 85
"""
train_df = duckdb.query(query).to_df()
我收到以下错误:
IOException: IO Error: No files found that match the pattern "../Data/train.parquet"
我确认文件路径是正确的,并且使用
../Data/train.parquet
加载时相对(pandas.read_parquet()
)和绝对路径都有效。对于 DuckDB,我尝试了相对路径和绝对路径,但仍然收到相同的IOException
。这是我使用绝对路径的代码:
import os
absolute_path = os.path.abspath('../Data/train.parquet')
query = f"""
SELECT *
FROM '{absolute_path}'
WHERE date_id <= 85
"""
train_df = duckdb.query(query).to_df()
确认 Parquet 文件位于指定路径并使用
pandas
正常加载。但是,我想避免使用 pandas
来读取文件,因为这会将整个数据集加载到内存中,而我的系统由于 RAM 限制而无法处理。
为什么 DuckDB 无法直接读取此 Parquet 文件,即使它使用
pandas
正确加载? DuckDB 是否需要特定的配置或设置才能在 Jupyter Notebooks 或 VS Code 中处理 Parquet 文件?是否有其他方法可以在 DuckDB 中查询大型 Parquet 文件而不将所有内容加载到内存中?
任何见解或建议将不胜感激。
希望这些示例能够提供一些帮助(在 Linux Mint 操作系统上运行)
tree /testing
testing
├── Data
│ ├── source
│ │ ├── abspath.py
│ │ ├── relative.py
│ │ ├── tick1.py
│ │ ├── tick2.py
│ │ └── testMe.py
│ └── train.parquet
└── title
2 directories, 7 files
$ cat testMe.py
import duckdb
import sys
import os
absolute_path = os.path.abspath(f'{sys.argv[1]}') #pass in the filename on the command line
query = f""" SELECT * FROM '{absolute_path}' """
print(f"\nSCRIPT:{sys.argv[0]} filename:{sys.argv[1]}")
print(f'absolute_path:[{absolute_path}]')
print(f'QUERY:[{query}]')
try:
ls=os.listdir( os.path.dirname(sys.argv[1] )) # get the path only
except Exception as e:
print(f"ERROR: {e}\n\n" )
print(f'Cannot execute query: {query}\n' )
else:
print(f'os.listdir({ls}\n')
train_df = duckdb.query(query).to_df()
print(f'ROWS:{train_df.shape[0]}\n')
$######################
$# first run - full path to file
$#
$ python testMe.py /testing/Data/train.parquet
SCRIPT:testMe.py filename:/testing/Data/train.parquet
absolute_path:[/testing/Data/train.parquet]
QUERY:[ SELECT * FROM '/testing/Data/train.parquet' ]
os.listdir(['train.parquet', 'source']
ROWS:3376567
$######################
$# second run - relative path referencing the Data directory
$#
$ python testMe.py ../../Data/train.parquet
SCRIPT:testMe.py filename:../../Data/train.parquet
absolute_path:[/testing/Data/train.parquet]
QUERY:[ SELECT * FROM '/testing/Data/train.parquet' ]
os.listdir(['train.parquet', 'source']
ROWS:3376567
$######################
$# third run - relative path referencing the parent Data diretory simply as '..'
$#
$ python testMe.py ../train.parquet
SCRIPT:testMe.py filename:../train.parquet
absolute_path:[/testing/Data/train.parquet]
QUERY:[ SELECT * FROM '/testing/Data/train.parquet' ]
os.listdir(['train.parquet', 'source']
ROWS:3376567
$######################
$# fourth run - relative path referencing the parent Data diretory simply as '../Data' (erroneously)
$#
$ python testMe.py ../Data/train.parquet
SCRIPT:testMe.py filename:../Data/train.parquet
absolute_path:[/testing/Data/Data/train.parquet]
QUERY:[ SELECT * FROM '/testing/Data/Data/train.parquet' ]
ERROR: [Errno 2] No such file or directory: '../Data'
Cannot execute query: SELECT * FROM '/testing/Data/Data/train.parquet'