C++读取Parquet文件遇Snappy编码未实现问题求助
问题场景
我已通过Python成功解析Parquet文件并提取所需数据,代码如下:
import pandas as pd import shapely.wkb import shapely.geometry import matplotlib.pyplot as plt import utm df = pd.read_parquet("lanes_small.parquet", engine="fastparquet") plt.figure() for index, object in df.iterrows(): if not "segment" in object["id"]: continue linestring = shapely.wkb.loads(object["geometry"]) coordinates = shapely.geometry.mapping(linestring)["coordinates"] xy_coordinates = [utm.from_latlon(lat, lon) for lon, lat in coordinates] plt.plot( [xy_coord[1] for xy_coord in xy_coordinates], [xy_coord[0] for xy_coord in xy_coordinates], ) plt.show()
但在C++中实现相同操作时遇到报错,当前代码:
arrow::MemoryPool* pool = arrow::default_memory_pool(); std::shared_ptr<arrow::io::RandomAccessFile> input; input = *arrow::io::ReadableFile::Open(path); std::unique_ptr<parquet::arrow::FileReader> arrow_reader; arrow::Status open_status = parquet::arrow::OpenFile(input, pool, &arrow_reader); if(!open_status.ok()){ std::cout << "Failed open: " << open_status.ToString(); } std::shared_ptr<arrow::Table> table; arrow::Status read_table_status = arrow_reader->ReadTable(&table); if(!read_table_status.ok()){ std::cout << "Failed read: " << read_table_status.ToString() << std::endl; }
运行后报错:
Failed read: NotImplemented: Support for codec 'snappy' not built
我已在Conan项目中添加相关依赖:
[requires] snappy/1.2.0 arrow/15.0.0 [options] arrow/*:parquet=True arrow/*:with_boost=True arrow/*:with_thrift=True arrow/*:snappy=True
请问该如何解决这个问题?
解决方案
修正Conan选项并强制重新构建
Arrow的Conan包中,启用Snappy的正确选项名为with_snappy而非snappy,同时需明确开启Parquet对Snappy的支持。更新conanfile.txt:[requires] snappy/1.2.0 arrow/15.0.0 [options] arrow/*:parquet=True arrow/*:with_snappy=True arrow/*:with_parquet=True parquet/*:with_snappy=True arrow/*:with_boost=True arrow/*:with_thrift=True执行命令强制重新构建Arrow和Snappy包,确保依赖从源码编译并包含所需功能:
conan install . --build=arrow --build=snappy验证Conan构建配置
检查Conan生成的构建文件(如conanbuildinfo.cmake或CMakeCache.txt),确认以下变量被设置为ON:ARROW_WITH_SNAPPYPARQUET_WITH_SNAPPYARROW_WITH_PARQUET
确保CMake正确链接依赖
在CMakeLists.txt中,显式链接Arrow、Parquet和Snappy库:find_package(Arrow REQUIRED) find_package(Parquet REQUIRED) find_package(Snappy REQUIRED) target_link_libraries(your_target_name PRIVATE Arrow::arrow Parquet::parquet Snappy::snappy )重新生成CMake构建文件并编译项目,确认无链接错误。
确认Parquet文件的压缩格式
用Python工具验证目标Parquet文件确实使用Snappy压缩:import fastparquet pq_file = fastparquet.ParquetFile("lanes_small.parquet") print("Compression codecs:", [col.compression for col in pq_file.columns])输出应包含
snappy,排除文件本身压缩格式不匹配的问题。
内容的提问来源于stack exchange,提问作者JakobVinkas
相关产品推荐
相关产品推荐

