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

C++环境下如何从Apache Arrow compute函数中提取标量值

核心理解误区

  • arrow::Datum是Arrow中用来承载计算结果的多态容器,它本身不直接存储基础类型数值,内部可以持有Scalar、Array、RecordBatch等多种类型的Arrow对象,需要先提取对应类型的内部对象才能取值
  • arrow::compute::Year函数的返回类型固定为Int64类型,当你传入单个Scalar作为输入时,返回的Datum内部持有的是arrow::Int64Scalar实例,而非直接的int64_t值或者int64_t的智能指针

正确取值方式

你可以按照以下步骤从返回结果中提取int64类型的年份值:

arrow::NumericArray<arrow::Date32Type> array = {...}
for (int64_t i = 0; i < array.length(); i++) {
  arrow::Result<std::shared_ptr<arrow::Scalar>> result = array->GetScalar(i);
  if (!result.ok()) {         
     // TODO: handle error
  }

  arrow::Result<arrow::Datum> year = arrow::compute::Year(*result);
  if (!year.ok()) {
     // TODO: handle compute error
  }

  // 1. 从Datum中取出内部持有的Scalar对象
  std::shared_ptr<arrow::Scalar> year_scalar = year.ValueOrDie().scalar();
  // 2. 将Scalar基类强转为实际对应的Int64Scalar类型
  auto year_int_scalar = std::static_pointer_cast<arrow::Int64Scalar>(year_scalar);
  // 3. 从Int64Scalar中取出int64_t类型的实际值
  int64_t year_val = year_int_scalar->value;
}

性能优化建议

Arrow的compute API是面向向量化执行设计的,逐元素调用计算函数会大幅降低性能,更推荐直接对整个Array发起计算,批量获取结果:

// 直接对整个数组执行Year计算,内部自动向量化处理
arrow::Result<arrow::Datum> year_result = arrow::compute::Year(array);
if (!year_result.ok()) {
  // TODO: handle error
}
// 取出返回的Int64数组
auto year_array = std::static_pointer_cast<arrow::Int64Array>(year_result.ValueOrDie().array());
// 直接遍历数组取值即可
for (int64_t i = 0; i < year_array->length(); i++) {
  int64_t year_val = year_array->Value(i);
  // 处理年份
}

内容的提问来源于stack exchange,提问作者Will Ayd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:02