现在 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。
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)