尽管路径正确,DuckDB 仍不读取 Parquet 文件

问题描述 投票:0回答:1

我正在尝试在 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 文件而不将所有内容加载到内存中?

任何见解或建议将不胜感激。

python pandas dataframe parquet duckdb
1个回答
0
投票

希望这些示例能够提供一些帮助(在 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'

© www.soinside.com 2019 - 2024. All rights reserved.