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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:50:35