使用 PyArrow 读取 QuestDB parquet 整个表

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

现在 QuestDB 可以直接生成 Parquet 格式的表,我正在尝试使用 pyarrow 和以下代码来探索数据:

import pyarrow.dataset as ds

# Define the base directory
base_dir = "/opt/homebrew/var/questdb/db/chicago_parquet_water_sensors~2414"

dataset = ds.dataset(
    base_dir,
    format="parquet",
    partitioning="hive"   
)

df = dataset.to_table()

我收到此错误:

Exception during reset or similar
Traceback (most recent call last):
  File "/Users/j/prj/python/questdb_dataset_utils/venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 3505, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "/var/folders/_5/q677vj0j0nn7hz56s8_gsgpc0000gn/T/ipykernel_45561/2530093135.py", line 14, in <module>
    df = dataset.to_table()
  File "pyarrow/_dataset.pyx", line 546, in pyarrow._dataset.Dataset.to_table
  File "pyarrow/_dataset.pyx", line 3449, in pyarrow._dataset.Scanner.to_table
  File "pyarrow/error.pxi", line 144, in pyarrow.lib.pyarrow_internal_check_status
  File "pyarrow/error.pxi", line 100, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Could not open Parquet input source '/opt/homebrew/var/questdb/db/chicago_parquet_water_sensors~2414/2023-09.46/MeasurementID.d': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.

当我检查文件夹时,我可以看到大多数分区都包含一个 parquet 文件,但有一个分区没有 parquet 文件,这就是给我带来麻烦的地方。如果我指向一个单独的分区,一切都很好,但我想访问整个表。

如果我尝试使用相同的代码指向其他地方生成的 parquet 数据集,我不会遇到任何问题,所以这一定是 QuestDB 的事情,而不是 pyarrow。

database time-series questdb
1个回答
0
投票

QuestDB 以 Parquet 格式存储除活动分区之外的所有分区。为了提高效率,活动分区使用 QuestDB 自己的二进制格式存储(因为它可能会获取更新和无序数据,而使用 parquet 处理效率较低)。

最简单的解决方法是告诉 arrow 跳过无效(非 parquet)文件,如下所示:

import pyarrow.dataset as ds

# Define the base directory
base_dir = "/opt/homebrew/var/questdb/db/chicago_parquet_water_sensors~2414"

dataset = ds.dataset(
    base_dir,
    format="parquet",
    partitioning="hive", 
    exclude_invalid_files=True  

)

df = dataset.to_table()

当使用其他工具时,比如 DuckDB,它接受通配符,我们可以明确指定 parquet 扩展名。

select * from read_parquet('/opt/homebrew/var/questdb/db/chicago_parquet_water_sensors~2414/*/*.parquet', hive_partitioning = true)
© www.soinside.com 2019 - 2024. All rights reserved.