You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_SNAPPY
    • PARQUET_WITH_SNAPPY
    • ARROW_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:41