Apache Arrow C++:GetScalar获取表值代码编译失败,原代码曾可用
Apache Arrow C++ 获取表中值编译失败问题解决
几年前可正常运行的代码如今编译失败,问题出在table->column(0)->GetScalar(0).ValueOrDie()->Value<int32_t>()这一行。完整代码如下:
#include <arrow/api.h> int main() { // create an Arrow array of int32_t values std::vector<int32_t> values = {1, 2, 3}; std::shared_ptr<arrow::Array> array; arrow::Int32Builder builder; builder.AppendValues(values); builder.Finish(&array); // create an Arrow table with a single column of int32_t values std::shared_ptr<arrow::Field> field = arrow::field("col", arrow::int32()); std::vector<std::shared_ptr<arrow::Field>> fields = {field}; std::shared_ptr<arrow::Schema> schema = arrow::schema(fields); std::vector<std::shared_ptr<arrow::Array>> columns = {array}; std::shared_ptr<arrow::Table> table = arrow::Table::Make(schema, columns); // get the scalar value of the first element in the column int32_t value = table->column(0)->GetScalar(0).ValueOrDie()->Value<int32_t>(); std::cout << "Value: " << value << std::endl; return 0; }
问题原因与解决方法
Apache Arrow C++的API在版本迭代中发生了变更,GetScalar的返回值处理和标量取值方式都有调整,旧代码不再兼容新版本。
方案一:直接通过具体类型数组取值(推荐)
跳过Scalar中转,直接将列数组转为对应类型(如Int32Array),调用其类型安全的Value方法,更高效且避免类型转换问题:
修改后的完整代码:
#include <arrow/api.h> #include <iostream> int main() { // 创建int32_t类型的Arrow数组 std::vector<int32_t> values = {1, 2, 3}; std::shared_ptr<arrow::Array> array; arrow::Int32Builder builder; builder.AppendValues(values); builder.Finish(&array); // 创建包含单个int32_t列的Arrow表 std::shared_ptr<arrow::Field> field = arrow::field("col", arrow::int32()); std::vector<std::shared_ptr<arrow::Field>> fields = {field}; std::shared_ptr<arrow::Schema> schema = arrow::schema(fields); std::vector<std::shared_ptr<arrow::Array>> columns = {array}; std::shared_ptr<arrow::Table> table = arrow::Table::Make(schema, columns); // 获取第一列第一个元素值:先转为Int32Array类型 auto int32_array = std::static_pointer_cast<arrow::Int32Array>(table->column(0)->chunk(0)); int32_t value = int32_array->Value(0); std::cout << "Value: " << value << std::endl; return 0; }
方案二:保留Scalar方式取值
如果必须通过Scalar获取值,需要先将通用Scalar转为具体类型(如Int32Scalar),再访问其成员变量:
// 替换原取值代码段 auto scalar_result = table->column(0)->GetScalar(0); if (!scalar_result.ok()) { // 此处可添加错误处理逻辑 return 1; } auto scalar = scalar_result.ValueOrDie(); auto int32_scalar = std::static_pointer_cast<arrow::Int32Scalar>(scalar); int32_t value = int32_scalar->value;
内容的提问来源于stack exchange,提问作者Al Merchant
相关产品推荐
相关产品推荐

