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

如何在Apache Arrow C++中按条件筛选arrow::table的行?

在Apache Arrow C++中实现日期过滤(等效于Pandas的df[df['certain_date'] > '2023-05-26'])

当然可行,你需要用Arrow Compute的比较函数而非is_in(is_in用于集合匹配,不适合范围比较)。以下是完整实现步骤和代码示例:

核心步骤

  • 将目标日期字符串转换为Arrow兼容的日期类型(通常用date32,对应自1970-01-01的天数)
  • 调用arrow::compute::Greater函数对日期列和目标日期做比较,生成布尔过滤掩码
  • 用arrow::compute::Filter函数将原表应用掩码,得到过滤后的结果表

完整代码示例

#include <arrow/api.h>
#include <arrow/compute/api.h>
#include <arrow/compute/api_vector.h>
#include <arrow/result.h>
#include <iostream>

arrow::Result<std::shared_ptr<arrow::Table>> FilterDateColumn(
    const std::shared_ptr<arrow::Table>& input_table,
    const std::string& column_name,
    const std::string& target_date_str) {

    // 1. 获取目标日期列
    auto date_column = input_table->GetColumnByName(column_name);
    if (!date_column) {
        return arrow::Status::Invalid("Column not found: ", column_name);
    }

    // 2. 将目标日期字符串转换为date32类型的标量
    arrow::Date32Scalar target_date;
    auto parse_status = arrow::ParseDate32(target_date_str, &target_date.value);
    if (!parse_status.ok()) {
        return parse_status;
    }

    // 3. 生成过滤掩码:日期列 > 目标日期
    ARROW_ASSIGN_OR_RAISE(auto mask, arrow::compute::Greater(*date_column, target_date));

    // 4. 应用掩码过滤表
    ARROW_ASSIGN_OR_RAISE(auto filtered_table, arrow::compute::Filter(*input_table, mask));

    return filtered_table;
}

int main() {
    // 示例:创建一个包含日期列的测试表
    auto date_values = arrow::Date32Array::FromVector({
        arrow::Date32(arrow::GetDate32("2023-05-20")),
        arrow::Date32(arrow::GetDate32("2023-05-27")),
        arrow::Date32(arrow::GetDate32("2023-06-01")),
        arrow::Date32(arrow::GetDate32("2023-05-25"))
    });
    auto schema = arrow::schema({arrow::field("certain_date", arrow::date32())});
    auto input_table = arrow::Table::Make(schema, {date_values});

    // 执行过滤
    auto result = FilterDateColumn(input_table, "certain_date", "2023-05-26");
    if (!result.ok()) {
        std::cerr << "Filter failed: " << result.status().message() << std::endl;
        return 1;
    }

    // 打印结果表
    std::cout << "Filtered table:" << std::endl;
    result.ValueOrDie()->Print();

    return 0;
}

关键说明

  • 日期类型:示例中用date32(32位整数存储天数),如果你的日期列是date64(存储毫秒级时间戳),只需替换Date32Scalar为Date64Scalar,ParseDate32为ParseDate64即可。
  • Compute函数:arrow::compute::Greater支持日期类型的比较,内部会自动处理日期的数值转换逻辑。
  • 错误处理:示例用ARROW_ASSIGN_OR_RAISE宏简化Arrow的Result/Status错误处理,这是Arrow C++开发的标准做法。

内容的提问来源于stack exchange,提问作者Abhishek Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:48:27